424_____________________Часть III. Современное программирование на C++
/ I Операция присваивания .
Xs operator=( const X& rhs)
{ if ( this == Srhs) return *this;
// выполняет присваивание, развернутое копирование
// или еще что-нибудь
return *this;
} private:
// данные-члены );
В строке *this = rhs; неявно вызывается операция присваивания. Такая форма вызова довольно туманна и может стать причиной ошибок. Ранее все время подчеркивалось, что перегрузка операций, как правило, происходит неявно, здесь же это правило бесцеремонно'нарушается. Это сделано для ясности, а также потому, что разработчику клас.са так или иначе следует об этом знать.
Листинг 17.5 показывает, как реализовать копирование через присваивание.
// Конструктор копий вызывает операцию присваивания явно,
// точно так же, .как и любую другую функцию
Х (const X&rhs)
{ operator"(rhs); }
// Операция присваивания
X& operator=(const X& rhs)
( if ( this == srhs) return *this;
// код присваивания/копирования
return *this;
}
Здесь операция присваивания вызывается явно, подобно любой другой функции. В развернутой форме этот вызов можно представить как
this->operator=(rhs);
Предварять вызов функции указателем this излишне, хотя и вполне корректно. Реализация копирования через присваивание позволяет свести разработку и отладку двух этих функций к одной — операции присваивания, независимо от эволюции вашего класса.
Замечание
Надо отметить, что при подобной реализации копирования происходит дополнительный вызов функции. Маловероятно, чтобы это могло существенно повлиять на производительность ваших программ, однако помнить об этом не мешает.