Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / ооп / 5. Об'єктно-орієнтоване програмування, л.1.5.ppt
Скачиваний:
0
Добавлен:
30.05.2020
Размер:
96.77 Кб
Скачать

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

Методи визначаються статичним типом і всі екземпляри даного типу розділяють один і той самий екземпляр коду методів маючи при цьму свій екземпляр даних.

Якщо клас визначає дані, індивідуальні для кожного класу об'єкту, то звертатися до таких індивідуальних данних можуть лише нестатичні методи.

Вказівник this

Надає ім'я індивідуальний структурі даних для кожного об'єкта.

Семантично він відповідає адресі «всього екземпляру об'єкта».

Всередині методу класу this є «вказівка на самого себе».

Всередині кожного екземпляра будь-якого

класу this буде мати своє значення - його заздалегідь не знає програміст, але - дуже добре знає компілятор. І його обов'язково отримає будь-який нестатичний метод об'єкту

Указатель this

monstr & the_best(monstr &M){

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

}

void cure(int health, int ammo){ this -> health += health; monstr:: ammo += ammo;

}

...

monstr Vasia(50), Super(200); monstr Best = Vasia.the_best(Super);

Конструктори

Конструктор не повертає значення, навіть типу void. Неможна отримати вказівник на конструктор.

Клас може мати кілька конструкторів з різними параметрами для різних видів ініціалізації (при цьому використовується механізм первантаження).

Конструктор, що викликається без параметрів, має назву конструктор по замовчанню.

Параметри конструктора можуть мати довільний тип, крім цього ж класу. Можна задавати значення параметрів по замовчанню. Їх може містити лише один з конструкторів.

Конструктори - продовження

Якщо програміст не вказав жодного конструктора, компілятор створює його автоматично. Такий конструктор викликає конструктори по замовчанню для полів класу і конструктори по замовчанню для базових класів.

Конструктори не спадкуються.

Конструктори неможна описувати як const, virtual і static.

Конструктори глобальних об'єктів викликаються до виклику функції main.

Локальні об'єкти створюються, лише тоді, коли стає активною область їх дії.

Конструктор запускається і при створенні тимчасового об'єкта (наприклад, при передаванні об'єкта з функції).

Виклик конструктора

Виклик конструктора здійснюється, якщо в програмі зустрілась одна з конструкцій:

імя_класу имя_объекта [(список параметрів)]; імя_класу (список параметрів); імя_класу імя_обєкта = вираз;

monstr Super(200, 300), Vasia(50), Z; monstr X = monstr(1000);

monstr Y = 500;

Кілька конструкторів

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]; strcpy(name, nam);

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

Список ініціалізаторів конструктора

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

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

Конструктор копіювання

T::T(const T&) { /* Тело конструктора */ }

при описі нового об'єкта з ініціалізацією іншим об'єктом;

при передачі об'єкта до функції за значенням;

при поверненні об'єкта з функції.

при обробці виключень.

Приклад конструктора копіювання

monstr::monstr(const monstr &M){ if (M.name){

name = new char [strlen(M.name) + 1]; strcpy(name, M.name);}

else name = 0;

health = M.health; ammo = M.ammo; skin = M.skin;

}

monstr Vasia (blue); monstr Super = Vasia;

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