developing.ru - клуб программистов Здесь может быть и ваша реклама.
developing.ru >технология COM >

Указатель this

В C++ существует специальный указатель this. Для "процедурных программистов" эта тема является довольно "тугой" для понимания, поэтому немного о том, что такое указатель this в контексте нашей серии статей.

Экземпляр объекта, как мы рассматривали в статье "Введение в теорию компиляции. И выведение из неё...", есть семантическое соединение двух сущностей - данных, располагаемых в сегменте данных и методов, располагаемых в сегменте кода. Данные объекта могут изменяться во время жизни объекта, а методы - нет. Методы целиком определяются его статическим типом и все экземпляры данного статического типа разделяют один и тот же экземпляр кода методов имея при этом свой экземпляр данных.

При этом в C++ различаются статические методы класса и нестатические методы класса, причём утверждается, что только нестатические методы класса могут обращаться к нестатическим же данным класса. Что это такое и почему существует это правило?

А правило говорит вот о чём - если класс определяет данные, которые у каждого экземпляра объекта будут индивидуальны, то обращаться к таким индивидуальным данным могут только нестатические методы. Статическим методам к ним обращаться нельзя.

Чем отличаются оба типа методов? Только одним - нестатические методы имеют скрытый параметр, который им подставляет компилятор, когда генерирует вызов - в этом параметре компилятор передаёт адрес структуры данных, соответствующих данному экземпляру объекта. А у статических методов такого параметра нет, поэтому они и не могут адресоваться к индивидуальным данным экземпляра.

Вот этот-то самый указатель, именующий индивидуальную структуру данных для каждого объекта и называется "указатель this". Семантически он соответствует адресу "всего экземпляра объекта". И когда компилятор компилирует код метода класса, то все ссылки на свои данные экземпляра (например, на переменную "x") компилятор по умолчанию трактует как this->x. Т.о. внутри метода класса this есть "указатель на самого себя". Естественно, что внутри каждого экземпляра всякого класса this будет иметь своё значение - его заранее не знает программист, зато - очень хорошо знает компилятор. И его обязательно получит и любой нестатический метод объекта.

Но сам метод - "не обслуживается" this. Методы-то класса всегда разделяются всеми экземплярами класса. И уничтожаются - только данные класса, а методы неуничтожимы. Поэтому вызов конструкции delete this вполне корректен, он заставит метод класса разрушить данный экземпляр данных (объект) класса, но не сам этот метод - другие экземпляры того же класса не пострадают.


© 2000-2004 Клуб программистов developing.ru