Реализация конструктора копирования(перемещения) через равно копирования (перемещения)
Хорошая ли идея писать так:
class A
{
public:
A(const A& other)
{
//Вызов равно копирования.
(*this) = other;
}
public:
A& operator =(const A& other)
{
//Какая-то реализация...
return *this;
}
};
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Просто жуткая! потому что в присваивании вы должны аккуратно уничтожить объект, в который копируете - а для этого первоначально его создать...
Вот наоборот - куда лучше :)
Пишем функцию swap(A& other), которая обменивает содержимое двух объектов, и конструктор копирования. После этого присваивание (а не "равно") пишется через конструктор копирования как
A& operator=(const A& other)
{
A tmp(other);
swap(tmp);
return *this;
}
Даже проверять на равенство this == &other - и то необязательно, отработает корректно. Конечно, можно его добавить - чисто вящей эффективности для...
Можно даже короче -
A& operator=(A other)
{
swap(other);
return *this;
}