Sugestão de implementação do construtor de cópia e operador de atribuição em C++:
- Crie um construtor de cópia com passagem de parâmetro por referência para uma constante.
- Crie um operador de atribuição com passagem de parâmetro por valor e retorno por referência.
- Crie uma função membro de swap. Idealmente, que não lance exceções.
- Dentro do operador de atribuição, faça a troca (swap) entre o argumento construído por cópia e o objeto apontado por
this.
Essa é uma solução elegante e sem redundâncias (considerando que todos os swaps estejam corretamente implementados). Além disso, não depende da verificação de auto-atribuição no operator=. Para detalhes relacionados a exception-safety, clique aqui.
class person
{
public:
person(std::string name);
person(person const& other); //Construtor cópia.
person & operator=(person other); //Operador atribuição.
void swap(person & other) throw();
private:
std::string name_;
unsigned short age_;
/* ... */
};
person::person(std::string name):
name_(name), age_(0) /* ... */
{}
person::person(person const& other):
name_(other.name_), age_(other.age_) /* ... */
{}
person & person::operator=(person other)
{
other.swap(*this); //Troca com a cópia recebida.
return *this;
}
void person::swap(person & other) throw()
{
name_.swap(other.name_);
std::swap(age_, other.age_);
/* ... */
}
Lembre que nem sempre é necessário declarar/definir esses membros para todas as classes. O código acima visa apenas ilustrar uma forma de implementação.
Leandro T. C. Melo