Информатика и технология программирования

Конструктор копирования объектов


Как правило, при создании объекта вызывается конструктор, за исключением случая, когда объект создается как копия другого объекта этого же класса, например


dat date2 = date1;

Однако имеются случаи, в которых создание объекта без вызова конструктора осуществляется неявно:



-формальный параметр -объект, передаваемый по значению, создается в стеке в момент вызова функции и инициализируется копией фактического параметра;



-результат функции -объект, передаваемый по значению, в момент выполнения оператора return копируется во временный объект, сохраняющий результат функции.

Во всех трех случаях транслятор не вызывает конструктора для вновь создаваемого объекта:



-dat2 в приведенном определении;



-создаваемого в стеке формального параметра;



-временного объекта, сохраняющего значение, возвращаемое функцией.

Вместо этого в них копируется содержимое объекта-источника:



-dat1 в приведенном примере;



-фактического параметра;



-объекта -результата в операторе return.

При наличии в объекте указателей на динамические переменные и массивы или идентификаторов связанных ресурсов, такое копирование требует дублирования этих переменных или ресурсов в объекте-приемнике, как это было сделано выше в операции присваивания. С этой целью вводится конструктор копирования, который автоматически вызывается во всех перечисленных случаях. Он имеет единственный параметр -ссылку на объект-источник:


//------------------------------------------------------bk73-06.cpp


//------Конструктор копирования для класса строк


class string
{
char *Str;
int size;
public:
string(string&#38); // Конструктор копирования


};
string::string(string&#38 right) // Создает копии динамических


{ // переменных и ресурсов


s = new char[right-&#62size];
strcpy(Str,right-&#62Str);
}

Конструктор копирования обязателен, если в программе используются функции-элементы и переопределенные операции, которые получают формальные параметры и возвращают в качестве результата такой объект не по ссылке, а по значению.



Содержание раздела