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

21.7. Синтаксис ініціалізації членів-даних класу

У прикладах програм, наведених у попередніх розділах, члени-даних набували початкові значення у конструкторах своїх класів. Наприклад, наведений нижче код програми містить клас myClass, який містить два члени-даних numA і numB. Ці члени ініціалізувалися у конструкторі myClass().

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

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

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

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

int numA;

int numB;

public:

// Ініціалізація членів numA і numB у конструкторі myClass(),

використовуючи звичайний синтаксис. */

myClass(int x, int y) { numA = x; numB = y;}

int getNumA() { return numA;}

int getNumB() { return numB;}

};

int main()

{

myClass A_ob(7, 9), B_ob(5, 2);

cout << "Значення членів-даних об'єкта A_ob дорівнює "

<< A_ob.getNumB() << " і " << A_ob.getNumA() << endl;

cout << "Значення членів-даних об'єкта B_ob дорівнює "

<< B_ob.getNumB() << " і " << B_ob.getNumA() << endl;

getch(); return 0;

}

Результати виконання цієї програми є такими:

Значення членів-даних об'єкта A_ob дорівнює 9 і 7

Значення членів-даних об'єкта B_ob дорівнює 2 і 5

Присвоєння початкових значень членам-даних numA і numB у конструкторі, як це робиться у конструкторі myClass(), – звичайна практика, яка застосовується для багатьох класів. Але цей метод придатний не для всіх випадків. Наприклад, якби члени numA і numB були задані як const-змінні, тобто так:

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

const int numA; // const-член

const int numB; // const-член,

то їм не можна було б присвоїти значення за допомогою конструктора класу myClass, оскільки const-змінні повинні ініціалізуватися одноразово, після чого їм вже не можна надати інші значення. Такі проблеми виникають під час використання посилальних членів, які повинні ініціалізуватися, і під час використання членів класу, які не мають конструкторів за замовчуванням. Для вирішення проблем такого роду у мові програмування C++ передбачено підтримку альтернативного синтаксису ініціалізації членів-даних класу, який дає змогу присвоювати їм початкові значення під час створення об'єкта класу.

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

constructor (перелік_аргументів): член1(ініціалізація),

член2(ініціалізація),

//...

члениN (ініціалізація)

{

// Тіло конструктора

}

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

Нижче представлена попередня програма, але перероблена так, щоби члени numA і numB були оголошені з використанням модифікатора const, і набували свої початкові значення за допомогою альтернативного синтаксису ініціалізації членів-даних класу.

Код програми 21.15. Демонстрація способу оголошення членів-даних класу з використанням модифікатора const

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

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

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

const int numA; // const-член

const int numB; // const-член

public:

// Ініціалізація членів numA і numB з використанням

// альтернативного синтаксису ініціалізації.

myClass(int x, int y): numA(x), numB(y) { }

int getNumA() { return numA;}

int getNumB() { return numB;}

};

int main()

{

myClass A_ob(7, 9), B_ob(5, 2);

cout << "Значення членів-даних об'єкта A_ob дорівнює "

<< A_ob.getNumB() << " і " << A_ob.getNumA() << endl;

cout << "Значення членів-даних об'єкта оb2 дорівнює "

<< B_ob.getNumBf) << " і " << B_ob.getNumA() << endl;

getch(); return 0;

}

Ця програма відображає на моніторі такі ж результати, як і її попередня версія. Проте зверніть увагу на те, як ініціалізовано члени numA і numB:

myClass(int x, int y): numA(x), numB(y) { }

У цьому записі член даних numA ініціалізувався значенням, переданим у аргументі х, а член numB – значенням, переданим у аргументі y. І хоча члени numA і numB зараз визначені як const-змінні, проте вони можуть набути свої початкові значення під час створення об'єкта класу myClass, оскільки тут використовується альтернативний синтаксис ініціалізації членів-даних класу.