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

12.2.1. Параметризовані конструктори

Конструктор може мати параметри. За допомогою них під час створення об'єкта членам-даних (змінним класу) можна подати деякі початкові значення, що визначаються у основній функції main(). Це реалізується шляхом передачі аргументів конструктору об'єкта. У наведеному нижче прикладі спробуємо удосконалити клас chergaClass так, щоб він приймав аргументи, які слугуватимуть ідентифікаційними номерами (nom) черги. Передусім необхідно внести зміни у визначення класу chergaClass:

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

int qpMas[100];

int sloc, rloc;

int who; // Містить ідентифікаційний номер черги

public:

chergaClass(int nom); // Оголошення параметризованого конструктора

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

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

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

};

Член-даних who використовують для зберігання ідентифікаційного номера (nom), створюваного програмою черги. Її реальне значення визначається значенням, що передається конструктору як формальний параметр nom, під час створення змінної типу chergaClass. Конструктор chergaClass() буде мати такий вигляд:

// Визначення параметризованого конструктора

chergaClass::chergaClass(int nom)

{

sloc = rloc = 0;

who = nom;

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

}

Щоб передати аргумент конструкторові, необхідно пов'язати цей аргумент з об'єктом під час його створення. Мова програмування C++ підтримує два способи реалізації такого зв'язування:

Варіант 1 Варіант 2 (альтернативний)

chergaClass A_ob = chergaClass(101); chergaClass A_ob = 101;

У цьому оголошенні створюється черга з іменем A_ob, якій передається значення (ідентифікаційний номер) 101. Але цей формат (у такому контексті) використовується рідко, оскільки другий спосіб має коротший запис і тому зручніший для використання. У другому способі аргумент повинен знаходитися за іменем об'єкта і поміщатися в круглі дужки. Наприклад, така настанова еквівалентна попереднім визначенням:

chergaClass A_ob(101);

Це найпоширеніший спосіб визначення параметризованих об'єктів. З використанням цього способу наведемо загальний формат передачі аргументів конструкторам:

тип_класу ім'я_об'єкта(список_аргументів);

У цьому записі елемент список_аргументів є переліком аргументів, розділених між собою комами, що передаються конструктору.

Варто знати! Формально між двома наведеними вище форматами ініціалізації існує невелика відмінність, яку Ви зрозумієте під час подальшого читання цього навчального посібника. Але ця відмінність не впливає на результати виконання програм, представлених у цьому розділі.

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

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

#include <vcl>

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

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

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

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

int qpMas[100];

int sloc, rloc;

int who; // Містить ідентифікаційний номер черги

public:

chergaClass(int nom); // Оголошення параметризованого конструктора

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

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

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

};

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

chergaClass::chergaClass(int nom)

{

sloc = rloc = 0;

who = nom;

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

}

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

chergaClass::~chergaClass()

{

cout << "Чергу " << who << " зруйновано.\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(1), B_ob(2);

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;

}

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

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

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

10 20

19 1

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

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

Як видно з коду функції main(), черзі, пов'язаній з іменем A_ob, присвоюється ідентифікаційний номер 1, а черзі з іменем B_ob – ідентифікаційний номер 2.

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

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

#include <vcl>

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

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

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

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

int izm, jzm;

public:

widClass(int a, int b); // Оголошення параметризованого конструктора

void putWid();

};

// Передаємо 2 аргументи конструктору widClass().

widClass::widClass(int a, int b)

{

izm = a; jzm = b;

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

}

void widClass::putWid()

{

cout << "izm= " << izm << "; jzm= " << jzm << "\n";

}

int main()

{

// Створення та ініціалізація двох об'єктів.

widClass X_ob(10, 20), Y_ob(0, 0);

X_ob.putWid();

Y_ob.putWid();

getch(); return 0;

}

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

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

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

izm= 10; jzm= 20

izm= 0; jzm= 0

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