Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
77
Добавлен:
07.03.2016
Размер:
1.78 Mб
Скачать

Void main()

{

Sf l (1, 2, 3, 4);

Sf t;

cout << "x = " << l.x << "\n";

t=l;

cout << t. kv();

}

//Виведення:

//Х = 1

//201. 062

Як приклад класу з декількома конструкторами удосконалимо описаний раніше клас 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;}

};

// ----------------------------------------------

monstr::monstr(int he, int am)

{

health = he; ammo = am; skin = red; name = 0;

}

// ----------------------------------------------

monstr::monstr(color sk)

{

switch (sk)

{

case red:

health = 100;

ammo = 10;

skin = red;

name = 0;

break;

case green:

health = 100;

ammo = 20;

skin = green;

name = 0;

break;

case blue:

health = 100;

ammo = 40;

skin = blue;

name = 0;

break;

}

}

// ----------------------------------------------

monstr::monstr(char* nam)

{

name = new char [strlen(nam) + 1];

// До довжини рядок додається 1 для зберігання нуль-символа

strcpy(name, nam);

health = 100; ammo =10; skin = red;

}

// ----------------------------------------------

monstr* m = new monstr ("Ork");

monstr Green (green);

Перший з приведених вище конструкторів є конструктором за умовчанням, оскільки його можна викликати без параметрів. Об'єкти класу monstr тепер можна ініціалізувати різними способами, необхідний конструктор буде викликаний залежно від списку значень в дужках. При завданні декількох конструкторів слід дотримуватись тих же правил, що і при написанні переобтяжених функцій – у компілятора має бути можливість розпізнати потрібний варіант.

Існує ще один спосіб ініціалізації полів в конструкторі (окрім використаного в приведеній вище програмі привласнення полям значень формальних параметрів) – за допомогою списку ініціалізаторів, розташованих після двокрапки між заголовком та тілом конструктора:

monstr::monstr(int he, int am):

health (he), ammo (am), skin (red), name (0){}

Поля перераховуються через кому. Для кожного поля в дужках указується значення, що ініціалізується, яке може бути виразом. Без цього способу не обійтися при ініціалізації полів-констант, полів-посилань і полів-об'єктів, В останньому випадку буде викликаний конструктор, відповідний вказаним в дужках параметрам.

Конструктор не може повернути значення, щоб повідомити про помилку під час ініціалізації. Для цього можна використовувати механізм обробки виключних ситуацій, який буде розглянутий нижче.

Деструктор, як вже наголошувалося, – це особливий вид методу, що застосовується для звільнення пам'яті, займаної об'єктом. Деструктор викликається автоматично, коли об'єкт виходить з області видимості:

  • для локальних об'єктів – при виході з блоку, в якому вони оголошені;

  • для глобальних –як частина процедури виходу з main();

  • для об'єктів, заданих через вказівки, деструктор викликається неявно при використанні оператору delete.

Деструктор:

  • не має аргументів та значення, яке повертається;

  • не може бути оголошений як const або static;

  • не успадковується.

Якщо деструктор явним чином не визначений, компілятор автоматично створює порожній деструктор. Описувати в класі деструктор явним чином потрібний у разі, коли об'єкт містить вказівки на пам'ять, що виділяється динамічно – інакше при знищенні об'єкту пам'ять, на яку посилалися його поля-вказівки, не буде помічена як вільна. Вказівку на деструктор визначити не можна. Якщо об'єкт містить вказівку на масив, скажімо поле char* name та ініціалізував в конструкторі, як name = new char[10], тоді деструктор повинен виглядати таким чином:

monstr::~monstr() {delete [ ] name;}

Деструктор можна викликати явним чином, наприклад:

Monstr* m;

m ─>~monstr();

Це може знадобитися для об'єктів, яким за допомогою перевизначеного оператору new виділялася конкретна адреса пам'яті. Без необхідності явно викликати деструктор об'єкту не рекомендується.