Указатель this
Каждый объект содержит свой экземпляр полей класса.
Методы класса находятся в памяти в единственном экземпляре и используются всеми объектами совместно, поэтому необходимо обеспечить работу методов с полями именно того объекта, для которого они были вызваны. Это обеспечивается передачей в функцию скрытого параметра this, в котором хранится константный указатель на вызвавший функцию объект.
Указатель this неявно используется внутри метода для ссылок на элементы объекта.
В явном виде этот указатель применяется в основном для возвращения из метода указателя (return this;) илиссылки (return *this;) на вызвавший объект.
Для иллюстрации использования указателя this добавим в приведенный выше класс monstr новый метод, возвращающий ссылку на наиболее здорового (поле health) из двух монстров, один из которых вызывает метод, а другой передается ему в качестве параметра (метод нужно поместить в секцию public описания класса):·
monstr & the_best(monstr &M){
if( health > M.health) return *this;
return M;
}
... monstr Vasia(50), Super(200);
// Новый объект Best инициализируется значениями полей Super:
monstr Best = Vasia.the_best(Super);
-----
Указатель this можно также применять для идентификации поля класса в том случае, когда его имя совпадает с именем формального параметра метода. Другой способ идентификации поля использует операцию доступа к области видимости:
void cure(int health, int ammo){
this -> health += health;// Использование this
monstr:: ammo += ammo;// Использование операции::
}
Конструкторы·
Конструктор предназначен для инициализации объекта и вызывается автоматически при его создании.
Основные свойства конструкторов:
· Конструктор не возвращает значение, даже типа void. Нельзя получить указатель на конструктор.
· Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации (при этом используется механизм перегрузки).
· Конструктор, вызываемый без параметров, называется конструктором по умолчанию.
· Параметры конструктора могут иметь любой тип, кроме этого же класса. Можно задавать значения параметров по умолчанию. Их может содержать только один из конструкторов.
· Если программист не указал ни одного конструктора, компилятор создает его автоматически. Такой конструктор вызывает:
- конструкторы по умолчанию для полей класса и
- конструкторы по умолчанию базовых классов (см. раздел «Простое наследование», с. 201).
Примечание. В случае, когда класс содержит константы или ссылки, при попытке создания объекта класса будет выдана ошибка, поскольку их необходимо инициализировать конкретными значениями, а конструктор по умолчанию этого делать не умеет.
· Конструкторы не наследуются.
· Конструкторы нельзя описывать с модификаторами const, virtual и static.
· Конструкторы глобальных объектов вызываются до вызова функции main. Локальные объекты создаются, как только становится активной область их действия. Конструктор запускается и при создании временного объекта (например, при передаче объекта из функции).
· Конструктор вызывается, если в программе встретилась какая-либо из синтаксических конструкций:
имя_класса имя_объекта [(список параметров)];
// Список параметров не должен быть пустым
имя_класса (список параметров);
// Создается объект без имени (список может быть пустым)
имя_класса имя_объекта = выражение;
// Создается объект без имени и копируется
Примеры:
monstr Super(200, 300), Vasia(50), Z;
monstr X = monstr(1000);
monstr Y = 500;
В первом операторе создаются три объекта. Значения не указанных параметров устанавливаются по умолчанию.
Во втором операторе создается безымянный объект со значением параметра health = 1000 (значение второго параметра устанавливается по умолчанию). Выделяется память под объект X, в которую копируется безымянный объект. (Безымянные объекты.Программе зачастую требуются «одноразовые» объекты, для которых только и требуется, что передать их на вход функции или метода, либо использовать их в выражении в качестве аналога константы.)
В последнем операторе создается безымянный объект со значением параметра health = 500 (значение второго параметра устанавливается по умолчанию). Выделяется память под объект Y, в которую копируется безымянный объект. Такая форма создания объекта возможна в том случае, если для инициализации объекта допускается задать один параметр.
В качестве примера класса с несколькими конструкторами усовершенствуем описанный ранее класс monstr, добавив в него поля, задающие цвет (skin) и имя (name):
enum color {red, green, blue};// Возможные значения цвета
class monstr{
int health, ammo;
color skin;
char *name;
public:
monstr(int he = 100, int am =10);
monstr(color sk);
monstr(char * nam);
int get_health(){return health;}
int get_ammo(){return ammo;}