Конструктор создания копии

Конструктор создания ко­пии - это конструктор, аргументом которого является объект того же класса. Объект-аргумент конструктора передается только по ссылке. Причина кро­ется в том, что конструктор создания копии вызывается при инициализации объекта. Напомним, что в этом случае конструктором создается безымянный объект, который затем интерпретируется как создаваемый (инициализируемый при объявлении). Если аргумент функции (в том числе и конструктору) передается по значению, то на самом деле для объекта-аргумента создается копия. Предположим, в конструкторе создания копии аргумент передается по значению. В этом случае для создания копии аргумента вызывается конструктор создания копии. У этого конструктора создания копии есть аргу­мент, для которого необходимо было бы создавать копию. Создание копии подразумевает вызов все того же конструктора, и так далее. Передача аргумента по ссылке предотвращает такую рекурсивную неприятность. Используемый по умолчанию конструктор создания копии, выполняющий побитовое копирование при создании объекта, не всегда приемлем. Класси­ческий пример такой ситуации - создание копии объекта, полем которого является указатель на третий объект. В этом случае два объекта через значения своих полей ссылаются на один и тот же объект, что может привести к серьезным проблемам, особенно если третий объект создавался динами­ чески. В таких и подобных им ситуациях выполняется переопределение конструктора создания копии. Хотя конструктор формально и называется конструктором создания ко­ пии, его можно переопределить так, что на основе объекта, переданного конструктору в качестве аргумента, будет создаваться совершенно иной по значениям своих полей объект (именно такой подход использован в коде ниже)
#include 
using namespace std;
class Demo{
public:
int n;
int m;
Demo(int i,int j){
n=i;
m=j;}
Demo(Demo &obj){
n=2*obj.n;
m=obj.m+3;}
void show(){
cout< < "n = " << n << endl;
cout << "m = " << m << endl;}
};
int main(){
int i;
Demo a(1,0);
Demo b=a;
a.show();
b.show();
for(i=1; i <=4; i++){
 a=Demo(a);}
 a.show();
 return 0;
}
Онлайн всего: 4
Гостей: 4
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте