Программирование. Принципы и практика использования C++ Исправленное издание, стр. 240
}Подразумевается, что функции-члену
copy()szargcopy()Конструктор копирования устанавливает количество элементов (
szelemvectorvector::vector(const vector& arg)// размещает элементы, а затем инициализирует их путем копирования :sz(arg.sz), elem(new double[arg.sz]){ copy(arg);}Имея конструктор копирования, мы можем вернуться к рассмотренному выше примеру.
vector v2 = v;Это определение инициализирует объект
v2vectorvvector
Теперь деструктор может работать правильно. Каждый набор элементов будет корректно удален. Очевидно, что два объекта класса
vectorvv2v.set(1,99); // устанавливаем v[1] равным 99v2.set(0,88); // устанавливаем v2[0] равным 88cout << v.get(0) << ' ' << v2.get(1);Результат равен
00Вместо инструкции
vector v2 = v;мы могли бы написать инструкцию
vector v2(v);Если объекты
vv218.2.2. Копирующее присваивание
void f2(int n){ vector v(3); // определяем вектор v.set(2,2.2); vector v2(4); v2 = v; // присваивание: что здесь происходит? // ...}Мы хотели бы, чтобы вектор
v2vvectorvectorszelemv2szelemvЭту ситуацию можно проиллюстрировать следующим образом:

При выходе из функции
f2()f()vv2delete[]v2class vector { int sz; double* elem; void copy(const vector& arg); // копирует элементы из arg // в *elempublic: vector& operator=(const vector&) ; // копирующее присваивание // ...};vector& vector::operator=(const vector& a) // делает этот вектор копией вектора a{ double* p = new double[a.sz]; // выделяем новую память for (int=0; i<asz; ++i) p[i]=a.elem[i]; // копируем элементы delete[] elem; // освобождаем память elem = p; // теперь можно обновить elem sz = a.sz;