Конструктор копіювання
Можна визначити об’єкти і одночасно їх ініціалізувати іншими за допомогою двох типів виразів:
alpha a3(a2); //ініціалізація копіювання
alpha a3=a2; //альтернативний запис ініціалізації копіювання
Обидва стилі визначення включають в себе конструктор копіювання, тобто конструктор, що створює новий об’єкт і копіює в нього свої аргументи. За замовчуванням цей конструктор здійснює поелементне копіювання. Це дуже схоже на те, що робить оператор присвоювання з тою різницею, що конструктор створює новий об’єкт.
Як і оператор присвоювання, конструктор копіювання може бути перезавантаженим. В програмі 22.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;
}
Програма 22.16
В цій програмі перезавантажується і оператор присвоювання і конструктор копіювання. Перезавантажене присвоювання схоже на аналогічне з програми 22.15. У конструктора копіювання є один аргумент – об’єкт типу alpha, що передається за посиланням. Його опис:
alpha(alpha&)
Він має вигляд Х(&X).
Вираз
а2=а1:
запускає оператор присвоювання, тоді як
alpha a3(a1);
запускає конструктор копіювання. З цією ж метою може бути використаний еквівалентний вираз:
alpha a3=a1;
Як вже було показано, конструктор копіювання може бути запущений під час визначення об’єкта. Він також запускається, коли аргументи передаються функціям за значенням і коли повертається результат роботи функцій. Коротко розглянемо ці ситуації.
Дата добавления: 2015-08-26; просмотров: 706;