Указатель this
Описание объектов
Конкретные переменные типа данных "класс" называются экземплярами класса, или объектами. Время жизни и видимость объектов зависит от вида и места описания и подчиняется общим правилам С++:
monster Vasia; // Объект класса monster с параметрами по умолчаниюmonster Super(200, 300);// Объект с явной инициализациейmonster stado[100]; // Массив объектов с параметрами по умолчанию/* Динамический объект (второй параметр задается по умолчанию) */monster *beavis = new monster (10); monster &butthead = Vasia; // Ссылка на объектПри создании каждого объекта выделяется память, достаточная для хранения всех его полей, и автоматически вызывается конструктор, выполняющий их инициализацию. Методы класса не тиражируются. При выходе объекта из области действия он уничтожается, при этом автоматически вызывается деструктор (деструкторы описаны далее).
Доступ к открытым (public) элементам объекта аналогичен доступу к полям структуры. Для этого используются операция . (точка) при обращении к элементу через имя объекта и операция -> при обращении через указатель:
объект.полеуказатель -> поле(*указатель).полеобъект.метод( параметры )указатель -> метод( параметры )(*указатель).метод( параметры )Обращение к открытому полю и вызов метода для массива объектов:
имя_массива[ индекс ].полеимя_массива[ индекс ].метод( параметры )Например:
int n = Vasia.get_ammo();stado[5].draw;cout << beavis->get_health();Получить или изменить значения private элементов можно только через обращение к соответствующим методам.
Можно создать константный объект, значения полей которого изменять запрещается. К нему должны применяться только константные методы:
class monster{...int get_health() const {return health;}};const monster Dead (0,0); // Константный объектcout << Dead.get_health();Константный метод:
- объявляется с ключевым словом const после списка параметров;
- не может изменять значения полей класса;
- может вызывать только константные методы;
- может вызываться для любых (не только константных) объектов.
Рекомендуется описывать как константные те методы, которые предназначены для получения значений полей.
Каждый объект содержит свой экземпляр полей класса. Методы места в классе не занимают и не дублируются для каждого объекта. Единственный экземпляр метода используется всеми объектами совместно, поэтому нестатический метод должен "знать", для какого объекта он вызван.
Каждый нестатический метод, помимо явно объявленных параметров, получает еще один скрытый параметр: константный указатель на объект, для которого он вызван. В С++ это указатель обозначается зарезервированным словом this. Когда имя параметра метода совпадает с именем поля класса, доступ к полю выполняется через этот указатель (например, this -> num).
Выражение *this представляет собой разыменование указателя и имеет тип определяемого класса. Обычно это выражение возвращается в качестве результата, если метод возвращает ссылку на свой класс (return *this;).
Для иллюстрации использования указателя this добавим в приведенный выше класс monster новый метод, возвращающий ссылку на наиболее здорового (поле health) из двух монстров, один из которых вызывает метод, а другой передается ему в качестве параметра (метод нужно поместить в секцию public описания класса):
monster & the_best(monster &M){if( health > M.get_health()) return *this;return M;}... monster Vasia(50), Super(200);// Новый объект Best инициализируется значениями полей Supermonster Best = Vasia.the_best(Super);