Конструктор создания копии
Конструктор создания копии - это конструктор, аргументом которого является объект того же класса. Объект-аргумент конструктора передается только по ссылке. Причина кроется в том, что конструктор создания копии вызывается при инициализации объекта. Напомним, что в этом случае конструктором создается безымянный объект, который затем интерпретируется как создаваемый (инициализируемый при объявлении). Если аргумент функции (в том числе и конструктору)
передается по значению, то на самом деле для объекта-аргумента создается копия. Предположим, в конструкторе создания копии аргумент передается по значению. В этом случае для создания копии аргумента вызывается конструктор создания копии. У этого конструктора создания копии есть аргумент, для которого необходимо было бы создавать копию. Создание копии подразумевает вызов все того же конструктора, и так далее. Передача аргумента по ссылке предотвращает такую рекурсивную неприятность. Используемый по умолчанию конструктор создания копии, выполняющий побитовое копирование при создании объекта, не всегда приемлем. Классический пример такой ситуации - создание копии объекта, полем которого является указатель на третий объект. В этом случае два объекта через значения своих полей ссылаются на один и тот же объект, что может привести к серьезным проблемам, особенно если третий объект создавался динами чески. В таких и подобных им ситуациях выполняется переопределение конструктора создания копии.
Хотя конструктор формально и называется конструктором создания ко пии, его можно переопределить так, что на основе объекта, переданного конструктору в качестве аргумента, будет создаваться совершенно иной по значениям своих полей объект (именно такой подход использован в коде ниже)
#includeusing 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; }