Недоліком|нестачею| розглянутих|розгледіти| раніше класів є|з'являється,являється| відсутність автоматичної ініціалізації створюваних об'єктів. Для кожного новостворюваного об'єкта необхідно було викликати|спричинити| функцію типу set (як для класу complex) або явно присвоювати значення даним об'єкта. Проте|однак| для ініціалізації об'єктів класу до його визначення можна явно включити спеціальну компонентну функцію, названу конструктором. Формат визначення конструктора наступний|слідуючий|:
ім'я _класу(список_форм_параметрів){ оператори_тіла_конструктора}
Ім'я цієї компонентної функції за правилами мови|язика| С++ має співпадати|збігатися| з|із| ім'ям класу. Така функція автоматично викликається|спричиняється| під час визначенні або розміщенні в пам'яті за допомогою оператора new кожного об'єкту класу.
Приклад|зразок|.
сomplex(double re1 = 0.0,double im1 = 0.0){re = re1; im = im1;}
Конструктор виділяє пам'ять для об'єкта та ініціалізує дані - члени класу.
Конструктор має ряд|лаву,низку| особливостей:
Для конструктора не визначають тип значення, що повертається. Навіть тип void неприпустимий.
Покажчик на конструктор не може бути визначено, і відповідно не можна одержати|отримати| адресу конструктора.
Конструктори не успадковуються|наслідують|.
Конструктори не можуть бути описані з|із| ключовими|джерельними| словами virtual, static, const, mutuable, valatile.
Конструктор завжди існує для будь-якого класу, причому, якщо він не визначений явно, він створюється автоматично. За умовчанням створюється конструктор без параметрів і конструктор копіювання. Якщо конструктор описано явно, то конструктор за умовчанням не створюється. За умовчанням конструктори створюються загальнодоступними (public).
Параметром конструктора не може бути його власний клас, але|та| може бути посилання|заслання| на нього (T&). Без явної вказівки програміста конструктор завжди автоматично викликається|спричиняється| під час визначення (створення|створінні|) об'єкта. У цьому випадку викликається|спричиняється| конструктор без параметрів. Для явного виклику конструктора використовують дві форми:
ім'я _класу ім'я _об’єкта (фактичні_параметри);
ім'я _класу (фактичні_параметри);
Перша форма допускається тільки|лише| при непорожньому|пустому| списку фактичних параметрів. Вона передбачає виклик конструктора під час визначення нового об'єкта даного класу:
complex ss (5.9,0.15);
Друга форма виклику приводить|призводить,наводить| до створення|створіння| об'єкта без імені:
complex ss = complex (5.9,0.15);
Існують два способи ініціалізації даних об'єкта за допомогою конструктора. Раніше ми розглядали|розглядували| перший спосіб, а саме передачу значень параметрів у тіло конструктора. Другий спосіб передбачає застосування|вживання| списку ініціалізаторів даного класу. Цей список розміщується| між списком параметрів і тілом конструктора. Кожний ініціалізатор| списку належить до конкретного компонента і має вигляд|вид|:
ім’я_даного (вираз|вираження|)
Приклади|зразки|.
class CLASS_A
{
int i; float e; char з|із|;
public:
CLASS_A(int ii,float ее,char cc) : i(8),e( i * її + ii ),с(сс|){
. . .
};
Клас “символьний рядок”.
#include <string.h>
#include <iostream.h>
class string
{
char *ch; // покажчик на текстовий рядок
int len; // довжина текстового рядка
public:
// конструктори
// створює об'єкт – порожній|пустий| рядок
string(int N = 80): len(0){ch = new char[N+1]; ch[0]= ‘0’;}
// створює об'єкт за заданим рядком
string(const char *arch){len = strlen(arch);
ch = new char[len+1];
strcpy(ch,arch);}
// компоненти-функції
// повертає посилання|заслання| на довжину рядка
int& len_str(void){return len;}
// повертає покажчик на рядок
char *str(void){return ch;}
. . .};
Тут у класі string два конструктори – перенавантажувані|перевантажувані| функції.
За умовчанням створюється також конструктор копіювання вигляду|виду|
T::T(const T&),
де Т – ім'я класу. Конструктор копіювання викликають|спричиняється| щоразу, коли виконується копіювання об'єктів, що належать класу. Зокрема він викликається|спричиняється|:
а) коли об'єкт передається функції за значенням;
б) під час побудови|шикуванні| тимчасового об'єкта, який повертає функція;
в) під час використання об'єкта для ініціалізації іншого об'єкта.
Якщо клас не містить|утримує| явним чином певного конструктора копіювання, то під час виникнення одної з цих трьох ситуацій проводять побітове копіювання об'єкта. Побітове копіювання не у всіх випадках є|з'являється,являється| адекватним. Саме для таких випадків і необхідно визначити власний конструктор копіювання. Наприклад, у класі string:
string(const string& st)
{len=strlen(st.len);
ch=new char[len+1];
strcpy(ch,st.ch); }
Можна створювати масив об'єктів, проте|однак| при цьому відповідний клас повинен мати конструктор за умовчанням (без параметрів).
Масив об'єктів може ініціалізуватися або автоматично конструктором за умовчанням, або явним привласненням значень кожному елементу масиву.
class demo{
int x;
public:
demo(){x=0;}
demo(int i){x=i;}
};
void main(){
class demo а[20]; //виклик конструктора без параметрів(за умовчанням)
class demo b[2]={demo(10),demo(100)};//явне привласнення