Конструктори

Конструктори ініціалізують об’єкт класу з необов’язковим списком аргументів. Аргументи, якщо вони використовуються, можуть мати значення за замовчуванням.

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

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

 

class IntStack

{

int *v, size, top;

public:

IntStack(int ezis); // оголошення

// ...

};

 

IntStack::IntStack(int ezis)

{

v = new int[size = ezis];

top = -1;

}

 

// оголошення IntStack. Викликається конструктор

IntStack huge(1000);

 

Конструктор не може бути оголошений ні const, ні volatile, ні static, ні virtual. Не має значення, що повертається.

Конструктори можуть бути викликані трьома еквівалентними способами:

 

IntStack good(100);

IntStack bad = IntStack(100); // явний

IntStack ugly = 100; // скорочений

 

Конструктори використовуються для ініціалізації константних полів і полів, які є змінними класу. Константне поле повинне бути ініціалізоване в кожному визначенні конструктора. Ім’я поля, обмежене дужками, відокремлюється від списку аргументів конструктора двокрапкою.

 

class IntStack

{

const int size;

// ...

};

 

IntStack:: IntStack(int ezis) : size(ezis)

{

v = new int [size];

top = -1;

}

 

Конструктори можуть бути перевантажені.

Конструктори можуть ініціалізувати масиви об’єктів класу в такий же спосіб, як і масиви вбудованих типів. Максимальна кількість елементів може бути опущена, якщо вона дорівнює кількості ініціалізуючих значень. Якщо максимальна кількість елементів більша за кількість значень, то елементи, що залишилися, ініціалізуються за допомогою конструктора за замовчуванням. Якщо задані всі значення для даного розміру масиву, то фігурні дужки при вказівці списку значень можуть бути опущені.

 

Phone office[] =

{

708, 555, 8887,

708, 555, 7255

};

 

Phone office[3] =

{

708, 555, 6012, // потрібен конструктор за замовчуванням,

708, 555, 3703 // якого Phone не має

};

1.1. Конструктори і перетворення типів

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

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

 

class String { /* ... */ String (const char*); };

class BitString { /* ... */ BitString (String); };

void f (const String& s) { /* ... */ }

void g (const BitString& b) { /* ... */ }

f (“Hello”); // Перетворення String(“Hello”);

g (“10110”); // помилка: не відбувається перетворення BitString(String(“10110”))