Вы должны использовать копирование и обмен.Для этого вам нужен конструктор копирования (и, возможно, также конструктор перемещения, если вы хотите использовать семантику перемещения).
class Bank_Client {
// Note that swap is a free function:
// This is important to allow it to be used along with std::swp
friend void swap(Bank_Client& c1, Bank_Client& c2) noexcept {
using std::swap;
swap(c1.name, c2.name);
// ...
}
// ...
};
// Note that we took the argument by value, not const reference
Bank_Client& Bank_Client::operator=(Bank_Client address) {
// Will call the swap function we defined above
swap(*this, adress);
return *this;
}
Теперь давайте посмотрим на код клиента:
Bank_Client bob("Bobinsky");
// 1. Copy constructor is called to construct the `address` parameter of `operator=()`
// 2. We swap that newly created copy with the current content of bob
// 3. operator=() returns, the temporary copy is destroyed, everything is cleaned up!
bob = bob;
Очевидно, что вы делаете бесполезную копию при самостоятельном назначении, но она имеет преимущество в том, что вы можете повторно использовать логику в конструкторе копирования (или в конструкторе перемещения), и это безопасно: ничего не делается, если исходная копиявыдает исключение.
Другое преимущество состоит в том, что вам нужна только одна реализация для operator=()
для обработки семантики копирования и перемещения (копирование-и-замена и перемещение-и-замена).Если производительность - большая проблема, у вас все еще может быть перегрузка rvalue operator=(Bank_Client&&)
, чтобы избежать дополнительного движения (хотя я не одобряю это).
В качестве последнего слова, я бы также посоветовал вам попытаться положиться на правило 0 в меру ваших возможностей, как в примере выше, в случае изменения содержимого класса вы также должны соответствующим образом обновить функцию подкачки.