Если у вас нет конструктора копирования, для вас будет создан конструктор по умолчанию, который делает поверхностное копирование , где каждая переменная-член одного объекта просто присваивается другому, в отличие от глубокая копия .
Поэтому, если у вас есть указатель на динамически выделенный буфер, конструктор копирования по умолчанию собирается просто назначить этот указатель указателю копии, а не создавать свой собственныйnew
буфер для указания и копирования содержимого буфера в новый.например.
class DynamicIntArray {
private:
int *_array;
size_t _size;
public:
DynamicIntArray(size_t size) : _array(new int[size]), _size(size) { }
DynamicIntArray (const DynamicIntArray &d) // copy constructor
{
delete[] _array;
_array = new int[d._size];
_size = d._size;
std::copy(_array, d._array, d._array + d._size);
}
/* destructor, assignment operator, etc */
};
Если вы не создали конструктор копирования по умолчанию, то созданный по умолчанию конструктор просто назначит d._array
для _array
, что может вызвать серьезные проблемы.то есть.Вместо вышесказанного это будет сделано:
_array = d._array;
_size = d._size;
Обратите внимание, что если у вас есть конструктор копирования, у вас, вероятно, должны быть оператор присваивания и деструктор (посмотрите rule-of-three ).