русс | укр

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

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


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


Конструктор копіювання


Дата додавання: 2014-04-22; переглядів: 1121.


Можна визначити об’єкти і одночасно їх ініціалізувати іншими за допомогою двох типів виразів:

alpha a3(a2); //ініціалізація копіювання

alpha a3=a2; //альтернативний запис ініціалізації копіювання

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

Як і оператор присвоювання, конструктор копіювання може бути перезавантаженим. В програмі 13.16 показано, як це робиться:

#include<iostream.h>

#include<conio.h>

#include<stdio.h>

#include<bios.h>

///////////////

class alpha

{private:

int data;

public:

alpha()

{ }

alpha(int d)

{data=d;}

alpha(alpha& a) //конструктор копіювання

{data=a.data;

cout<<”\nЗапущений конструктор копіювання”;

}

void display()

{cout<<data;}

 

void operator=(alpha& a)

{data=a.data;

cout<<”\nЗапущений оператор =”;

}

};

////////////////

 

int main()

{clrscr();

alpha a1(37);

alpha a2;

a2=a1; //Запуск перезавантаженого =

cout<<”\na2=”;a2.display();

alpha a3(a1); //запуск конструктора копіювання

//alpha a3=a1; //еквівалентне визначення а3

cout<<”\na3=”;a3.display();

cout<<endl;

bioskey(0);

return 0;

}

Програма 13.16

В цій програмі перезавантажується і оператор присвоювання і конструктор копіювання. Перезавантажене присвоювання схоже на аналогічне з програми 13.15. У конструктора копіювання є один аргумент – об’єкт типу alpha, що передається за посиланням. Його опис:

alpha(alpha&)

Він має вигляд Х(&X).

Вираз

а2=а1:

запускає оператор присвоювання, тоді як

alpha a3(a1);

запускає конструктор копіювання. З цією ж метою може бути використаний еквівалентний вираз:

alpha a3=a1;

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

 

Аргументи функції

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

void func(alpha);

була б оголошена в 13.17 і коли б вона викликалася виразом:

func(a1);

то конструктор копіювання створив би копію об’єкта а1 для його використання func(). Зрозуміло, що конструктор копіювання не запускається при передачі аргументу за посиланням чи при передачі вказівника на об’єкт. В цих випадках ніякі копії не створюються і функція працює з вихідною змінною

 


<== попередня лекція | наступна лекція ==>
Повернення значень | Повернення результатів роботи функції


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