Кент Рейсдорф. BORLAND C++BUILDER. Раздел 1

Кент Рейсдорф. BORLAND C++BUILDER. Страница 84

Что такое this?

Все классы имеют скрытый член с именем this. Это указатель на экземпляр данного класса в памяти. Очевидно, что необходимо сделать некоторое пояснение. Прежде всего, давайте посмотрим, как выглядел бы класс Rect, если бы this не был скрытым членом:


Так выглядит класс Rect для компилятора. При создании экземпляра класса указателю this автоматически присваивается адрес начала объекта в памяти:

«Но для чего нужен this?» — спросите вы. Вспомните, что каждый экземпляр класса имеет свою копию членов-данных. При этом все экзем­пляры используют один набор функций-членов класса (нет никаких причин создавать дубликаты функций для каждого экземпляра). Как же компилятор определяет, какой из экземпляров вызвал функцию? Для этого каждая функ- ция-член класса имеет скрытый аргумент this. Для иллюстрации предполо­жим, что у вас есть функция GetWidth(), являющаяся членом класса Rect. Она может выглядеть следующим образом: ^

Так эта функция выглядит для нас с вами. Компилятор, однако, видит ее примерно следующим образом:

Это не совсем верно с точки зрения внутренней реализации, но достаточно для нашего обсуждения. Из этого примера вы можете увидеть, что this уп­рощает работу с классами, оставаясь при этом в тени. Вам не нужно беспо­коиться о том, как это происходит, вы должны только знать, что это имеет место.

:Никогда не изменяйте указатель this. Вы можете передавать его другой функции в качестве аргумента, или использовать при создании новых классов, но не изменять. Приучите себя: рассматривать this как переменную только для чтения.

Несмотря на то, что this работает «за кулисами», он остается переменной, доступной внутри класса. Давайте ненадолго обратимся к VCL. В основном вы будете создавать компоненты VCL, помещая их в форму на этапе разработки. При этом C++Builder создает указатель на компонент и выполняет много ру­тинных действий, избавляя вас от необходимости вникать в технические по­дробности. Иногда, однако, вам понадобится создать компонент во время выполнения программы. VCL всегда должна знать, с каким объектом-предком связан объект-потомок. Например, вы хотите создать новую кнопку при щелч­ке на существующей кнопке. Для этого нужно сообщить VCL, какой объект является предком новой кнопки. Соответствующий код будет выглядеть сле­дующим образом:

Web-дизайн (с) 2010 All rights reserved