Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лаб_Гриф.doc
Скачиваний:
7
Добавлен:
14.11.2019
Размер:
2.81 Mб
Скачать

Ініціалізація об'єктів класу

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

Приклад

main( )

{

X one; //Викликається конструктор X::X( ) за умовчанням

//для об'єкта one класу Х

X two(1); //Викликається інший (перевантажений) конструктор X::X(int)

X three = 1; //Викликається X::X(int) – альтернативна форма зі знаком (=)

Х three(10, 8); //Використовувати не можна, неоднозначно заданий

//конструктор X(int, int ) або X::X(int а = 5, int b = 6)

X four = one; //Викликається X::X(const X&) для копіювання

//об'єкта one у four

X five(two); //Викликається X::X(cont X&) для копіювання two у five

}

Конструктор сприймає значення як параметри і виконує присвоювання даним-членам у тілі функції конструктора. Визначення конструктора як і будь-якої функції-члена може робитися в тілі класу.

Приклад

class X

{

int i, j; //За умовчанням private

public:

X(int a, int b) { i = a; j = b; } //Визначення конструктора в класі, він має

//доступ к і и j

X(int a, int b) : a(i), b(j) { } //Альтернативна форма для ініціалізації а і b

};

В обох випадках оголошеня об'єкта х та ініціалізація X x(1, 2) привласнює значення x::i = 1 і значення x::j = 2.

Деструктори

Деструктор класу викликається для руйнування елементів об'єкта до знищення самого об'єкта. Деструктор являє собою функцію-член, ім'я якої збігається з ім'ям класу, перед яким знаходиться символ тильди (~). Деструктор не може сприймати яких-небудь параметрів, а також не повідомляє типу та не повертає значення. Якщо деструктор не оголошений для класу явно, компілятор генерує його автоматично. Необхідність деструкторів у значній мірі зв'язана з покажчиками і динамічним виділенням пам'яті.

Коли відбувається динамічне виділення пам'яті для даних в об'єкті за допомогою new і об'єкти з покажчиками-членами виходять за межі області дії, то необхідний деструктор, який звільняє пам’ять виділену у “купі” і зв’язану з покажчиком-членом об'єкту. Для цього у деструкторі використовується оператор delete.

Приклад

class X

{ char *pt;

int i;

public:

X( ) { i = 0; pt = NULL; } //Визначення конструктора в класі

X( ) { delete pt; } //Визначення деструктора в класі, він звільнить

}; //пам’ять, яка буде виділена у “купі” і зв’язана з покажчиком pt

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

Приклад

main( )

{ X *pointer = new X; //Пам'ять для об'єкта класу Х виділена в купі

delete pointer; // delete звільняє пам’ять, яка виділена у “купі”

} //для об'єкта класу Х і зв’язана з покажчиком pointer