
- •Примеры
- •Примеры
- •[Править]в объектно-ориентированных языках
- •Параметрический полиморфизм
- •[Править]Специальный полиморфизм
- •[Править]Неявная типизация
- •Статический и динамический полиморфизм
- •Полиморфизм включения
- •Параметрический полиморфизм
- •Полиморфизм переопределения
- •Полиморфизм-перегрузка
- •Сравнение полиморфизма в функциональном и объектно-ориентированном программировании
- •Определение методов класса вне класса
- •Второй пример
- •Что вам необходимо знать
- •25. Inline Функции
- •26. Указатель this
- •27. Селекторы
- •5.1 Сопоставление шаблонов
- •5.2 Синтаксис селекторов
- •5.2.1 Группировка
- •5.3 Универсальный селектор
- •5.4 Селекторы типов
- •5.5 Селекторы потомков
- •5.6 Селекторы дочерних элементов
- •5.7 Селекторы сестринских элементов
- •5.8 Селекторы атрибутов
- •5.8.1 Сопоставление атрибутам и значениям атрибутов
- •5.8.2 Значения атрибутов, используемые в dtd по умолчанию
- •5.8.3 Селекторы классов
- •28. Модификаторы
- •29. Конструкторы
- •Назначение конструктора
- •Виды конструкторов
- •Конструктор по умолчанию
- •Конструктор копирования
- •Конструктор преобразования
- •Виртуальный конструктор
- •Синтаксис
- •Пример Конструктора по умолчания
- •31. Деструкторы
- •Виртуальный деструктор
- •Создание простого конструктора
- •Конструкторы и параметры по умолчанию
- •Перегрузка конструкторов
- •Представление о деструкторе
- •Что вам необходимо знать
- •32. Друзья
- •Определение друзей класса
- •Ограничение количества друзей
- •Что вам необходимо знать
- •Совместное использование элемента данных
- •Использование элементов с атрибутами public static, еслиобъекты не существуют
- •Использование статических функций-элементов
- •Что вам необходимо знать
- •37. Перезагрузка операций
- •Перегрузка унарных операций
- •Перегрузка постфиксных операций
- •Перегрузка бинарных операций
- •38. Преобразования типов
- •Const_cast не применим:
- •39. Наследование
- •Простое наследование
- •Второй пример
- •Что такое защищенные элементы
- •Разрешение конфликта имен
- •Что вам необходимо знать
- •40. Виртуальные функции и полиморфизм Виртуальные функции
- •Перекрытие методов
- •Абстрактные классы и чистые виртуальные функции
- •Модификаторы доступа
- •Ковариантность
26. Указатель this
В C++ существует специальный указатель this. Для "процедурных программистов" эта тема является довольно "тугой" для понимания, поэтому немного о том, что такое указатель this в контексте нашей серии статей.
Экземпляр объекта, как мы рассматривали в статье "Введение в теорию компиляции. И выведение из неё...", есть семантическое соединение двух сущностей - данных, располагаемых в сегменте данных и методов, располагаемых в сегменте кода. Данные объекта могут изменяться во время жизни объекта, а методы - нет. Методы целиком определяются его статическим типом и все экземпляры данного статического типа разделяют один и тот же экземпляр кода методов имея при этом свой экземпляр данных.
При этом в C++ различаются статические методы класса и нестатические методы класса, причём утверждается, что только нестатические методы класса могут обращаться к нестатическим же данным класса. Что это такое и почему существует это правило?
А правило говорит вот о чём - если класс определяет данные, которые у каждого экземпляра объекта будут индивидуальны, то обращаться к таким индивидуальным данным могут только нестатические методы. Статическим методам к ним обращаться нельзя.
Чем отличаются оба типа методов? Только одним - нестатические методы имеют скрытый параметр, который им подставляет компилятор, когда генерирует вызов - в этом параметре компилятор передаёт адрес структуры данных, соответствующих данному экземпляру объекта. А у статических методов такого параметра нет, поэтому они и не могут адресоваться к индивидуальным данным экземпляра.
Вот этот-то самый указатель, именующий индивидуальную структуру данных для каждого объекта и называется "указатель this". Семантически он соответствует адресу "всего экземпляра объекта". И когда компилятор компилирует код метода класса, то все ссылки на свои данные экземпляра (например, на переменную "x") компилятор по умолчанию трактует как this->x. Т.о. внутри метода класса this есть "указатель на самого себя". Естественно, что внутри каждого экземпляра всякого класса this будет иметь своё значение - его заранее не знает программист, зато - очень хорошо знает компилятор. И его обязательно получит и любой нестатический метод объекта.
Но сам метод - "не обслуживается" this. Методы-то класса всегда разделяются всеми экземплярами класса. И уничтожаются - только данные класса, а методы неуничтожимы. Поэтому вызов конструкции delete this вполне корректен, он заставит метод класса разрушить данный экземпляр данных (объект) класса, но не сам этот метод - другие экземпляры того же класса не пострадают.
-
Код C++
1
2
3
4
5
6
7
8
class Foo{
public:
Foo* GetThis()
{
// Возвращаем указатель на данный объект
return this;
}
};