25 ноября 2013

Указатель this

В C++ существует специальный указатель this.  Данные объекта могут изменяться во время жизни объекта, а методы – нет. Методы целиком определяются его статическим типом и все экземпляры данного статического типа разделяют один и тот же экземпляр кода методов имея при этом свой экземпляр данных.
При этом в C++ различаются статические методы класса и нестатические методы класса, причём утверждается, что только нестатические методы класса могут обращаться к нестатическим же данным класса. Что это такое и почему существует это правило?
А правило говорит вот о чём – если класс определяет данные, которые у каждого экземпляра объекта будут индивидуальны, то обращаться к таким индивидуальным данным могут только нестатические методы. Статическим методам к ним обращаться нельзя.
Чем отличаются оба типа методов? Только одним – нестатические методы имеют скрытый параметр, который им подставляет компилятор, когда генерирует вызов – в этом параметре компилятор передаёт адрес структуры данных, соответствующих данному экземпляру объекта. А у статических методов такого параметра нет, поэтому они и не могут адресоваться к индивидуальным данным экземпляра.
Вот этот-то самый указатель, именующий индивидуальную структуру данных для каждого объекта и называется “указатель this”. Семантически он соответствует адресу “всего экземпляра объекта”. И когда компилятор компилирует код метода класса, то все ссылки на свои данные экземпляра (например, на переменную “x”) компилятор по умолчанию трактует как this->x. Т.о. внутри метода класса this есть “указатель на самого себя”. Естественно, что внутри каждого экземпляра всякого класса this будет иметь своё значение – его заранее не знает программист, зато – очень хорошо знает компилятор. И его обязательно получит и любой нестатический метод объекта.
Но сам метод – “не обслуживается” this. Методы-то класса всегда разделяются всеми экземплярами класса. И уничтожаются – только данные класса, а методы неуничтожимы. Поэтому вызов конструкции delete this вполне корректен, он заставит метод класса разрушить данный экземпляр данных (объект) класса, но не сам этот метод – другие экземпляры того же класса не пострадают.

01

Источники

 37 total views,  1 views today



Copyright 2020. All rights reserved.

Опубликовано Кирилл в категории "C++