Конструктор копирования объектов
Как правило, при создании объекта вызывается конструктор, за исключением случая, когда объект создается как копия другого объекта этого же класса, например
dat date2 = date1;
Однако имеются случаи, в которых создание объекта без вызова конструктора осуществляется неявно:
-формальный параметр -объект, передаваемый по значению, создается в стеке в момент вызова функции и инициализируется копией фактического параметра;
-результат функции -объект, передаваемый по значению, в момент выполнения оператора return копируется во временный объект, сохраняющий результат функции.
Во всех трех случаях транслятор не вызывает конструктора для вновь создаваемого объекта:
-dat2 в приведенном определении;
-создаваемого в стеке формального параметра;
-временного объекта, сохраняющего значение, возвращаемое функцией.
Вместо этого в них копируется содержимое объекта-источника:
-dat1 в приведенном примере;
-фактического параметра;
-объекта -результата в операторе return.
При наличии в объекте указателей на динамические переменные и массивы или идентификаторов связанных ресурсов, такое копирование требует дублирования этих переменных или ресурсов в объекте-приемнике, как это было сделано выше в операции присваивания. С этой целью вводится конструктор копирования, который автоматически вызывается во всех перечисленных случаях. Он имеет единственный параметр -ссылку на объект-источник:
//------------------------------------------------------bk73-06.cpp
//------Конструктор копирования для класса строк
class string
{
char *Str;
int size;
public:
string(string&); // Конструктор копирования
};
string::string(string& right) // Создает копии динамических
{ // переменных и ресурсов
s = new char[right->size];
strcpy(Str,right->Str);
}
Конструктор копирования обязателен, если в программе используются функции-элементы и переопределенные операции, которые получают формальные параметры и возвращают в качестве результата такой объект не по ссылке, а по значению.