Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
40
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

180 Часть II. Объектно-ориентированное программирование

Все методы класса имеют непосредственный доступ к его скрытым полям, иными словами, тела функций класса входят в область видимости private элементов класса.

В приведенном классе содержится три определения методов и одно объявление (метод draw). Если тело метода определено внутри класса, он является встроенным (inline). Как правило, встроенными делают короткие методы. Если внутри класса записано только объявление (заголовок) метода, сам метод должен быть определен в другом месте программы с помощью операции доступа к области видимости (::):

void monstr::draw(int x, int у. int scale, int position)! /* тело метода */

} Метод можно определить как встроенный и вне класса с помощью директивы inline (как и для обычных функций, она носит рекомендательный характер):

inline int monstr::get_ammo(){ return ammo:

}

В каждом классе есть хотя бы один метод, имя которого совпадает с именем класса. Он называется конструктором и вызывается автоматически при создании объекта класса. Конструктор предназначен для инициализации объекта. Автоматический вызов конструктора позволяет избежать ошибок, связанных с использованием неинициализированных переменных. Мы подробно рассмотрим конструкторы в разделе «Конструкторы», с. 182.

Типы данных struct и union являются видами класса, разница между ними будет объяснена позже, на с. 209. Другой пример описания класса, а также пример локального класса приведен в разделе «Создание шаблонов классов» на с. 211.

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

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

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

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

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

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

//(второй параметр задается по умолчанию) monstr &butthead = Vasia: // Ссылка на объект

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

Глава 4. Классы

181

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

int n = Vasia.get_ammo();

stado[5].draw:

cout « beavis->get_health();

Обратиться таким образом можно только к элементам со спецификаторам publ ic. Получить или изменить значения элементов со спецификатором private можно только через обращение к соответствующим методам.

Можно создать константный объект, значения полей которого изменять запрещается. К нему должны применяться только константные методы:

class monstr{

int getJiealthO const {return health;}

}:

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

cout « Dead.getJiealthO;

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

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

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

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

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

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

Указатель this

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

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

monstr & thejbest(monstr &M){

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

182