Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

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

Як правило, певну частину об'єкта, перш ніж його можна буде використовувати, необхідно ініціалізувати. Наприклад, розглянемо клас chergaClass, який було представлено вище у цьому підрозділі. Перш ніж об'єкти класу chergaClass можна буде використовувати, змінним rloc і sloc потрібно надати нульові значення. У нашому випадку ця вимога виконувалася за допомогою функції init(). Але, оскільки вимога ініціалізації членів-даних класу є достатньо поширеною, у мові програмування C++ передбачено реалізацію цієї потреби під час створення об'єктів класу. Така автоматична ініціалізація членів-даних класу виконується завдяки використанню конструктора.

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

class chergaClass { // Оголошення класового типу

int qpMas[100];

int sloc, rloc;

public:

chergaClass(); // Оголошення конструктора

void putQp(int izm); // Введення в чергу значення

int getQp(); // Виведення з черги значення

};

Звернемо Вашу увагу на те, що в оголошенні конструктора chergaClass() відсутній тип значення, що повертається. У мові програмування C++ конструктори не повертають значень і, як наслідок, немає сенсу вказувати їх тип1.

Конструктор – це спеціальна функція, яка викликається під час створення об'єкта.

Тепер наведемо код функції chergaClass():

// Визначення конструктора

chergaClass::chergaClass()

{

sloc = rloc = 0;

cout << "Чергу ініціалізовано.\n";

}

У цьому випадку у процесі виконання конструктора ним виводиться повідомлення "Чергу ініціалізовано.", яка слугує виключно ілюстративній меті. На практиці ж здебільшого конструктори не виводять ніяких повідомлень.

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

Доповненням до конструктора слугує деструктор. У багатьох випадках під час руйнування об'єкта необхідно виконати певну дію або навіть певні послідовності дій. Локальні об'єкти створюються під час входу в блок, у якому вони визначені, і руйнуються при виході з нього. Глобальні об'єкти руйнуються при завершенні програми. Існує багато чинників, що зумовлюють необхідність використання деструкторів. Наприклад, об'єкт повинен звільнити раніше виділену для нього пам'ять. У мові програмування C++ саме деструкторам доручається оброблення процесу деактивізації об'єкта.

Ім'я деструктора має збігатися з іменем конструктора, але йому передує символ "~". Подібно до конструкторів, деструктори не повертають значень, а отже, в їх оголошеннях відсутній тип значення, що повертається.

Деструктор – це функція, яка викликається під час руйнування об'єкта.

Розглянемо вже знайомий нам клас chergaClass, але тепер він має містити конструктор і деструктор1:

class chergaClass { // Оголошення класового типу

int qpMas[100];

int sloc, rloc;

public:

chergaClass(); // Оголошення конструктора

~chergaClass(); // Оголошення деструктора

void putQp(int izm); // Введення в чергу значення

int getQp(); // Виведення з черги значення

};

// Визначення конструктора.

chergaClass::chergaClass()

{

sloc = rloc = 0;

cout << "Чергу ініціалізовано.\n";

}

// Визначення деструктора.

chergaClass::~chergaClass()

{

cout << "Чергу зруйновано.\n";

}

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

Код програми 12.2. Демонстрація механізму використання конструктора і деструктора

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

class chergaClass { // Оголошення класового типу

int qpMas[100];

int sloc, rloc;

public:

chergaClass(); // Оголошення конструктора

~chergaClass(); // Оголошення деструктора

void putQp(int izm); // Введення в чергу значення

int getQp(); // Виведення з черги значення

};

// Визначення конструктора.

chergaClass::chergaClass()

{

sloc = rloc = 0;

cout << "Чергу ініціалізовано.\n";

}

// Визначення деструктора.

chergaClass::~chergaClass()

{

cout << "Чергу зруйновано.\n";

}

// Введення в чергу значення.

void chergaClass::putQp(int izm)

{

if(sloc == 100) {

cout << "Черга заповнена.\n";

return;

}

sloc++;

qpMas[sloc] = izm;

}

// Виведення з черги значення.

int chergaClass::getQp()

{

if(rloc == sloc) {

cout << "Черга порожня.\n";

return 0;

}

rloc++;

return qpMas[rloc];

}

int main()

{

chergaClass A_ob, B_ob; // Створення двох об'єктів класу.

A_ob.putQp(10);

B_ob.putQp(19);

A_ob.putQp(20);

B_ob.putQp(1);

cout << A_ob.getQp() << " " << A_ob.getQp() << "\n";

cout << B_ob.getQp() << " " << B_ob.getQp() << "\n";

getch(); return 0;

}

У процесі виконання ця програма виводить на екран такі результати:

Чергу ініціалізовано.

Чергу ініціалізовано.

10 20

19 1

Чергу зруйновано.

Чергу зруйновано.