Copiando objetos de classe
Tanto a operação de atribuição como a operação de inicialização fazem com que os objetos sejam copiados.
Atribuição: quando o valor do objeto é atribuído a outro objeto, o primeiro objeto é copiado para o segundo objeto. Portanto,
Point a, b; ... a = b;
faz com que o valor de b seja copiado para a.
Inicialização: a inicialização ocorre quando um novo objeto é declarado, quando os argumentos são passados para funções por valor, ou quando os valores são retornados das funções por valor.
Você pode definir a semântica de “cópia” para objetos do tipo classe. Por exemplo, pense neste código:
TextFile a, b;
a.Open( "FILE1.DAT" );
b.Open( "FILE2.DAT" );
b = a;
O código anterior poderia significar “copiar o conteúdo de FILE1.DAT para FILE2.DAT” ou “ignore FILE2.DAT e faça de b um segundo manipulador para FILE1.DAT”. Você deve anexar a semântica de cópia apropriada a cada classe, da seguinte maneira.
Usando o operador de atribuição operator= junto com uma referência à tipo de classe como o tipo de retorno e o parâmetro passado pela referência const – por exemplo, ClassName& operator=(const ClassName& x);.
Usando o construtor de cópia. Para obter mais informações sobre o construtor de cópia, consulte Regras para declarar construtores.
Se você não declarar um construtor de cópia, o compilador gera um construtor de cópia por membros para você. Se você não declarar um operador de atribuição de cópia, o compilador gera um operador de atribuição por membros para você. A declaração de um construtor de cópia não suprime o operador de atribuição de cópia gerado pelo compilador, e vice-versa. Se você implementar um deles, recomendamos que você também implemente o outro para que o significado do código seja claro.
A atribuição por membros é abordada em mais detalhes em Inicialização e atribuição com reconhecimento de membro.
O construtor de cópia usa um argumento do tipo class-name**&**, onde class-name é o nome da classe para a qual o construtor é definido. Por exemplo:
// spec1_copying_class_objects.cpp
class Window
{
public:
Window( const Window& ); // Declare copy constructor.
// ...
};
int main()
{
}
Dica
Faça com que o tipo do argumento do construtor de cópia seja const class-name& sempre que possível.Isso evita que o construtor de cópia altere acidentalmente o objeto que está copiando.Ele também permite a cópia dos objetos const.