Partilhar via


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.

Consulte também

Referência

Funções de membro especiais (C++)