Оператор присваивания является функцией-элементом с именем operator=, который воспринимает единственный аргумент типа const тип_класа& (или тип_класа&).
Рекомендуется делать оператор присваивания возвращающим ссылку на объект, для которого он вызван. Тогда сохранится семантика присваивания, допускающая последовательные присвоения.
Оператор присваивания вызывается компилятором, когда объекту присваивается значение другого объекта. Компилятор генерирует присваивание по умолчанию, если вы не определили операцию присваивания. Присваивание по умолчанию производит побитное копирование. Например:
class CCoord
{
int iX, iY;
public:
//переопределяем конструктор по умолчанию
CCoord () : iX(0), iY(0){};
//конструктор с явным указанием стартовых значений полей
CCoord (int _iX, int _iY) : iX(_iX), iY(_iY){};
//конструктор копии
CCoord (const CCoord &src);
//определяем оператор присваивания
CCoord& operator=(const CCoord &src);
};
CCoord& CCoord::operator=(const CCoord &src)
{
iX = src.iX;
iY = src.iY;
return *this;
}
int main ()
{
CCoord coord1(7, 11); /*вызываем конструктор явно инициализирующий значения полей iX и iY*/
CCoord coord2(coord1); // конструктор копии
CCoord coord3 = coord1;
return 0;
}
В результате выполнения этого фрагмента кода, поля объектов coord2 и coord3 будут проинициализированы значениями соответствующих полей объекта coord1. То есть
coord3.iX == coord2.iX == coord1.iX == 7,
а
coord3.iY == coord2.iY == coord1.iY == 11.
В целях безопасности операция присваивания с помощью указателя this должна проверить возможность присвоения объекта самому себе. Например:
CCoord& CCoord::operator=(const CCoord &src)
{
if(&src == this)
error («присвоение самому себе»);
iX = src.iX;
iY = src.iY;
return *this;
}
Основное отличие копирующего оператора присваивания от копирующего конструктора состоит в том, что копирующий конструктор инициализирует «чистую» (неинициализированную) память, в то время как копирующий оператор присваивания должен правильно работать с уже созданным объектом. Основные шаги при реализации оператора присваивания – это защита от присваивания самому себе, удаление старых элементов, инициализация и копирование новых элементов. Как правило, все нестатические члены должны быть скопированы. Для создания отчета об ошибках, произошедших в процессе копирования, могут быть использованы исключения. |