Кент Рейсдорф. BORLAND C++BUILDER. Раздел 1
Кент Рейсдорф. BORLAND C++BUILDER. Страница 84
Все классы имеют скрытый член с именем this. Это указатель на экземпляр данного класса в памяти. Очевидно, что необходимо сделать некоторое пояснение. Прежде всего, давайте посмотрим, как выглядел бы класс Rect, если бы this не был скрытым членом:
Так выглядит класс Rect для компилятора. При создании экземпляра класса указателю this автоматически присваивается адрес начала объекта в памяти:
«Но для чего нужен this?» — спросите вы. Вспомните, что каждый экземпляр класса имеет свою копию членов-данных. При этом все экземпляры используют один набор функций-членов класса (нет никаких причин создавать дубликаты функций для каждого экземпляра). Как же компилятор определяет, какой из экземпляров вызвал функцию? Для этого каждая функ- ция-член класса имеет скрытый аргумент this. Для иллюстрации предположим, что у вас есть функция GetWidth(), являющаяся членом класса Rect. Она может выглядеть следующим образом: ^
Так эта функция выглядит для нас с вами. Компилятор, однако, видит ее примерно следующим образом:
Это не совсем верно с точки зрения внутренней реализации, но достаточно для нашего обсуждения. Из этого примера вы можете увидеть, что this упрощает работу с классами, оставаясь при этом в тени. Вам не нужно беспокоиться о том, как это происходит, вы должны только знать, что это имеет место.
:Никогда не изменяйте указатель this. Вы можете передавать его другой функции в качестве аргумента, или использовать при создании новых классов, но не изменять. Приучите себя: рассматривать this как переменную только для чтения.
Несмотря на то, что this работает «за кулисами», он остается переменной, доступной внутри класса. Давайте ненадолго обратимся к VCL. В основном вы будете создавать компоненты VCL, помещая их в форму на этапе разработки. При этом C++Builder создает указатель на компонент и выполняет много рутинных действий, избавляя вас от необходимости вникать в технические подробности. Иногда, однако, вам понадобится создать компонент во время выполнения программы. VCL всегда должна знать, с каким объектом-предком связан объект-потомок. Например, вы хотите создать новую кнопку при щелчке на существующей кнопке. Для этого нужно сообщить VCL, какой объект является предком новой кнопки. Соответствующий код будет выглядеть следующим образом: