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

1.4 Конструктори і деструктори

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

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

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

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

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

5. Якщо програміст не вказав жодного конструктора, компілятор створює його автоматично. Такий конструктор викликає конструктори за умовчанням для полів класу і конструктори за умовчанням базових класів (див. розділ "Спадкування"). У разі, коли клас містить константи або посилання, при спробі створення об'єкту класу буде виведена помилка, оскільки їх необхідно ініціалізувати конкретними значеннями, а конструктор за умовчанням цього робити не вміє.

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

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

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

9. Конструктор викликається, якщо в програмі зустрілася яка-небудь з синтаксичних конструкцій:

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

//Список параметрів не має бути порожнім

ім’я_класу (список параметрів);

//Створюється об'єкт без імені (список може бути порожнім)

ім'я класу ім’я_об’єкту = вираз;

//Створюється об'єкт без імені і копіюється

Приклади:

monstr Super(200, 300), Vasia(50), Z;

monstr X = monstr(1000);

monstr Y = 500;

У першому операторові створюються три об'єкти. Значення не вказаних параметрів встановлюються за умовчанням. У другому операторові створюється безіменний об'єкт із значенням параметра health = 1000 (значення другого параметра встановлюється за умовчанням). Виділяється пам'ять під об'єкт X, в яку копіюється безіменний об'єкт. У останньому операторові створюється безіменний об'єкт із значенням параметра health = 500 (значення другого параметра, це відноситься і до конструкторів, які є методами). Виділяється пам'ять під об'єкт Y, в яку копіюється безіменний об'єкт. Така форма створення об'єкту можлива в тому випадку, якщо для ініціалізації об'єкту допускається задати один параметр.

Методи можуть приймати аргументи по умовчанню. Це відноситься і до конструкторів, які є методами. Якщо в конструкторі Sf приймаються по умовчанню координати y = 2.0, z = 2.5, r = 1, тоді конструктор приймає вид:

Sf(float xk, float yk=2.0, float zk=2.5, float rk=1);

{x = xc; y = yc; z = zc; r = rk;}

Тепер можна створити змінну класу в такий спосіб:

Sf (1.0); // використання всіх аргументів по умовчанню;

Sf (1.0,1.1); //явно вказується координата y;

Sf (1.0,1.1,2.1,4.0); //скасовуються всі параметри по умовчанню.

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

Приклад: Цей приклад демонструє загальний випадок використання перегружених функцій конструкторів. У даному випадку один конструктор ініціалізує усі дані-члени, інший конструктор залишає всі дані-члени непроініціалізованими.

#include <iostream>

using namespace std;

#define M_PI 3.14159265358979323846

class Sf

{

public:

float r, x, y, z;

Sf(){} //нічого не робить

Sf(float xk, float yk, float zk, float rk)

{ x = xk; y = yk; z = zk; r = rk;}

float kv() {return r*r*4*M_PI;}

};