русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Конструктор


Дата додавання: 2014-11-28; переглядів: 849.


Недоліком|нестачею| розглянутих|розгледіти| раніше класів є|з'являється,являється| відсутність автоматичної ініціалізації створюваних об'єктів. Для кожного новостворюваного об'єкта необхідно було викликати|спричинити| функцію типу 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)};//явне привласнення


<== попередня лекція | наступна лекція ==>
Доступність компонентів класу | Деструктори


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн