В С++ версии 2.0 имеется операция присваивания по умолчанию, которая выполняет рекурсивное по членное копирование одного объекта в другой. В более ранних версиях использовался механизм побитового копирования.
vect first(200),second(200);
second=first; cout << second[10]; // =9
first[10]=-50; cout << second[10]; //=-50
Когда назначение не перегруженно, оно определяется по умолчанию с семантикой, представляющей собой присвоения значения. Это называется “семантикой поверхностного копирования” и не всегда допустимо. Перегрузка назначения желательна, а иногда и необходима, особенно, если класс содержит указатели динамически распределяемой памяти:
vect &vect::operator=(const vect &) {
int s=(size<v.size)? size: v.size;
for(int i=0; i<s; i++) p[i]=v.p[i]; return *this; }
Если необходимо запретить операцию присваивания для объектов данного класса, то ее нужно просто объявить в закрытой части объявления.
Class IntStack {
int *v, size,top;
public:
IntStack &operator=(const IntStack&);
};
IntStack & IntStack::operator=(IntStack &from) {
if(this!= &from) { // Проверка на from=from
delete [] v;
v= new int [size=from.size]; for(int i=0; i<size; i++) v[i]=from.v[i];
top=from.top;
}
return *this; // Позволяет выполнять множественное присваивание
}
IntStack a(100),b,c;
b=c=a;