Если все члены MyClass
имеют конструктор по умолчанию, то да.
Обратите внимание, что обычно все наоборот:
class MyClass
{
public:
MyClass(MyClass const&); // Implemented
void swap(MyClass&) throw(); // Implemented
MyClass& operator=(MyClass rhs) { rhs.swap(*this); return *this; }
};
Мы передаем по значению в operator=
так что вызывается конструктор копирования.Обратите внимание, что все безопасно для исключений, так как swap
гарантированно не генерирует (вы должны убедиться в этом в своей реализации).
РЕДАКТИРОВАТЬ, как требуется, о компоненте вызова по значению: operator=
можно записать как
MyClass& MyClass::operator=(MyClass const& rhs)
{
MyClass tmp(rhs);
tmp.swap(*this);
return *this;
}
Студентам C ++ обычно говорят передавать экземпляры классов по ссылке, потому что конструктор копирования вызывается, если они передаются по значению.В нашем случае мы все равно должны скопировать rhs
, так что передача по значению - это нормально.
Таким образом, operator=
(первая версия, вызов по значению) читает:
- Сделайте копию
rhs
(через конструктор копирования, автоматически вызываемый) - Поменяйте его содержимое с
*this
- Верните
*this
и позвольте rhs
(который содержит старыйvalue) быть уничтоженным при выходе из метода.
Теперь у нас есть дополнительный бонус с этим вызовом по значению.Если объект, передаваемый в operator=
(или любой функции, которая получает аргументы по значению), является временным объектом , компилятор может (и обычно делает) вообще не делать копии.Это называется copy elision .
Поэтому, если rhs
является временным, копия не создается.Нам осталось:
- Обмен
this
и rhs
содержимым - Уничтожить
rhs
Таким образом, передача по значению в этом случае больше эффективнее, чем при передаче по ссылке.