Программирование. Принципы и практика использования C++ Исправленное издание, стр. 241
return *this; // возвращаем ссылку // на текущий объект (см. раздел 17.10)}Присваивание немного сложнее, чем создание, поскольку мы должны работать со старыми элементами. Наша основная стратегия состоит в копировании элементов из источника класса
vectordouble* p = new double[a.sz]; // выделяем новую памятьfor(int=0; i<asz; ++i) p[i]=a.elem[i];Теперь освобождаем старые элементы из целевого объекта класса
vectordelete[] elem; // освобождаем занятую памятьВ заключение установим указатель
elemelem = p; // теперь можем изменить указатель elemsz = a.sz;
Теперь в классе
vectordelete[]
vector v(10);v=v; // самоприсваиваниеПожалуйста, убедитесь, что наша реализация функционирует правильно (если не оптимально).
18.2.3. Терминология, связанная с копированием
Копирование встречается в большинстве программ и языков программирования. Основная проблема при этом заключается в том, что именно копируется: указатель (или ссылка) или информация, на которую он ссылается.
• Поверхностное копирование (shallow copy) предусматривает копирование только указателя, поэтому в результате на один и тот же объект могут ссылаться два указателя. Именно этот механизм копирования лежит в основе работы указателей и ссылок.
• Глубокое копирование (deep copy) предусматривает копирование информации, на которую ссылается указатель, так что в результате два указателя ссылаются на разные объекты. На основе этого механизма копирования реализованы классы
vectorstringРассмотрим пример поверхностного копирования.
int* p = new int(77);int* q = p; // копируем указатель p*p = 88; // изменяем значение переменной int, на которую // ссылаются указатели p и q Эту ситуацию можно проиллюстрировать следующим образом.

В противоположность этому мы можем осуществить глубокое копирование.
int* p = new int(77);int* q = new int(*p); // размещаем новую переменную int, // затем копируем значение, на которое // ссылается p*p = 88; // изменяем значение, на которое ссылается pЭту ситуацию можно проиллюстрировать так.

vectorelemvectorvectorstringvectorint18.3. Основные операции
• Конструкторы с одним или несколькими аргументами.
• Конструктор по умолчанию.
• Копирующий конструктор (копирование объектов одинаковых типов).
• Копирующее присваивание (копирование объектов одинаковых типов).
• Деструктор.
Обычно класс должен иметь один или несколько конструкторов, аргументы которых инициализируют объект.
string s(" Триумф "); // инициализируем объект s строкой "Триумф"vector<double> v(10); // создаем вектор v, состоящий из 10 чисел // doubleКак видим, смысл и использование инициализатора полностью определяются конструктором. Стандартный конструктор класса
stringvector