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

Объект класса без конструкторов можно инициализировать путем присваивания ему другого объекта этого класса. Это можно делать и тогда, когда конструкторы описаны. Например:

date d = today; // инициализация посредством присваивания

По существу, имеется конструктор по умолчанию, определенный как почленная (в ранних версиях С++ - побитовая) копия объекта того же класса. Если для класса X такой конструктор по умолчанию нежелателен, его можно переопределить конструктором с именем X(X&).
Семантика вызова по значению требует, чтобы локальная копия типа параметра создавалась и инициализировалась от значения выражения, переданного как фактический параметр. Для этого необходим конструктор копии. Компилятор предоставляет такой конструктор по умолчанию. Его сигнатура

stack::stack(const stack&);

Компилятор производит копирование путем почленной инициализации. Это не всегда применимо. В большинстве случаев, указатель является адресом объекта, удаляемого при выходе из контекста. Однако, код, в котором производится действие по дублированию значения указателя, а не объекта, на который он указывает, может быть ошибочным. Дело в том, что удаление воздействует на другие экземпляры, все еще предполагающие, что объект существует. Поэтому важно, чтобы класс имел свою собственную явно определенную копию конструктора.

Stack::stack(const stack& str) {
s=new char [str.max_len]; max_len=str.max__len; top=str.top;
memcpy(s,str.s,max_len);
}

Конструктор копирования вызывается при возвращении значения объекта из функции
stack f(stack r) // вызов конструктора копирования при создании копии
{
return r; // вызов конструктора копирования для создании копии при возвращении
}
Конструктор копирования вызывается в случае инициализации при объявлении.
Stack s(10); // конструктор с одним параметром
Stack d=s; // конструктор копирования.
Все хорошо разработанные классы должны иметь конструктор копирования, особенно те, которые имеют дело с динамической памятью, открытыми файлами, любыми указателями.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: