Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / ооп / 4_кол / Лекції / статметоды, конструкторы, деструкторы.doc
Скачиваний:
24
Добавлен:
30.05.2020
Размер:
123.39 Кб
Скачать

Описание объектов

    Конкретные переменные типа "класс" называются экземплярами класса, или объектами. Время жизни и видимость объектов зависит от вида и места их описания и подчиняется общим правилам С++:

monstr Vasia;      // Объект класса monstr с параметрами по умолчанию

monstr Super(200, 300);      // Объект с явной инициализацией

monstr stado[100];      // Массив объектов с параметрами по умолчанию

monstr *beavis = new monstr (10);      // Динамический объект

          //(второй параметр задается по умолчанию)

// Ссылка на объект

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

     Доступ к элементам объекта аналогичен доступу к полям структуры. Для этого используются операция . (точка) при обращении к элементу через имя объекта и операция -> при обращении через указатель, например:

int n = Vasia.get_ammo();

stado[5].draw;

cout << beavis->get_health();

     Обратиться таким образом можно только к элементам со спецификатором public. Получить или изменить значения элементов со спецификатором private можно только через обращение к соответствующим методам.      Можно создать константный объект, значения полей которого изменять запрещается. К нему должны применяться только константные методы:

class monstr{

...

int get_health() const {return health;}

};

const monstr Dead(0,0); // Константный объект

cout << Dead.get_health();

Константный метод:

  • объявляется с ключевым словом const после списка параметров;

  • не может изменять значения полей класса;

  • может вызывать только константные методы;

  • может вызываться для любых (не только константных) объектов.

    Рекомендуется описывать как константные те методы, которые предназначены для получения значений полей.

Указатель this

    Каждый объект содержит свой экземпляр полей класса. Методы класса находятся в памяти в единственном экземпляре и используются всеми объектами совместно, поэтому необходимо обеспечить работу методов с полями именно того объекта, для которого они были вызваны. Это обеспечивается передачей в функцию скрытого параметра this, в котором хранится константный указатель на вызвавший функцию объект. Указатель this неявно используется внутри метода для ссылок на элементы объекта. В явном виде этот указатель применяется в основном для возвращения из метода указателя (return this;) или ссылки (return *this;) на вызвавший объект.

    Для иллюстрации использования указателя this добавим в приведенный выше класс monstr новый метод, возвращающий ссылку на наиболее здорового (поле health) из двух монстров, один из которых вызывает метод, а другой передается ему в качестве параметра (метод нужно поместить в секцию public описания класса):

monstr & the_best(monstr &M){

if( health > M.get_health()) return *this;

return M;

}

... monstr Vasia(50), Super(200);

// Новый объект Best инициализируется значениями полей Super:

Vasia.the_best(Super);

    Указатель this можно также применять для идентификации поля класса в том случае, когда его имя совпадает с именем формального параметра метода. Другой способ идентификации поля использует операцию доступа к области видимости:

void cure(int health, int ammo){

     this -> health += health; // Использование this

     monstr:: ammo += ammo; // Использование операции ::

}