Qual é a diferença entre o operador de atribuição e o construtor de cópia?

Eu não entendo a diferença entre o construtor de atribuição e o construtor de cópia em C ++. É assim:

class A { public: A() { cout << "A::A()" << endl; } }; // The copy constructor A a = b; // The assignment constructor A c; c = a; // Is it right? 

Eu quero saber como alocar memory do construtor de atribuição e construtor de cópia?

Um construtor de cópia é usado para inicializar um object não inicializado anteriormente dos dados de outros objects.

 A(const A& rhs) : data_(rhs.data_) {} 

Um operador de atribuição é usado para replace os dados de um object inicializado anteriormente por dados de outros objects.

 A& operator=(const A& rhs) {data_ = rhs.data_; return *this;} 

Você poderia replace a construção da cópia por construção padrão além de atribuição, mas isso seria menos eficiente.

(Nota: Minhas implementações acima são exatamente aquelas que o compilador concede a você de graça, então não faria muito sentido implementá-las manualmente. Se você tem uma dessas duas, é provável que você esteja gerenciando manualmente algum recurso. Nesse caso, de acordo com a Regra de Três , você provavelmente também precisará do outro mais um destruidor.

A diferença entre o construtor de cópia e o operador de atribuição causa muita confusão para novos programadores, mas não é tão difícil assim. Resumindo:

  • Se um novo object tiver que ser criado antes que a cópia possa ocorrer, o construtor de cópia será usado.
  • Se um novo object não precisar ser criado antes que a cópia possa ocorrer, o operador de atribuição será usado.

Exemplo para operador de atribuição:

 Base obj1(5); //calls Base class constructor Base obj2; //calls Base class default constructor obj2 = obj1; //calls assignment operator 

Exemplo para o construtor de cópia:

 Base obj1(5); Base obj2 = obj1; //calls copy constructor 

A primeira é a boot de cópia, a segunda é apenas atribuição. Não existe um construtor de atribuição.

 A aa=bb; 

usa o construtor de cópia gerado pelo compilador.

 A cc; cc=aa; 

usa o construtor padrão para construir cc e, em seguida, o operador * de atribuição ** ( operator = ) em um object já existente.

Eu quero saber como alocar memory do construtor de atribuição e construtor de cópia?

IDK o que você quer dizer com alocar memory neste caso, mas se você quiser ver o que acontece, você pode:

 class A { public : A(){ cout< <"default constructor"< 

Eu também recomendo que você dê uma olhada:

Por que o construtor de cópia é chamado em vez do construtor de conversão?

Qual é a regra dos três?

O que @Luchian Grigore Said é implementado assim

 class A { public : int a; A(){ cout< <"default constructor"< 

SAÍDA


construtor padrão


construtor de cópia


construtor padrão


operador de atribuição


a diferença entre um construtor de cópia e um construtor de atribuição é:

  1. No caso de um construtor de cópia, ele cria um novo object ( = )
  2. No caso de um construtor de atribuição, ele não criará nenhum object, o que significa que ele se aplica a objects já criados ( = ).

E as funcionalidades básicas em ambos são as mesmas, elas copiarão os dados de o2 para o1 membro por membro.

Eu quero adicionar mais um ponto sobre este tópico. “A function de operador do operador de atribuição deve ser escrita apenas como uma function de membro da class.” Não podemos fazer isso como function de amigo, ao contrário de outros operadores binários ou unários.

Algo a acrescentar sobre o construtor de cópias:

  • Ao passar um object por valor, ele usará construtor de cópia

  • Quando um object é retornado de uma function por valor, ele usará construtor de cópia

  • Ao inicializar um object usando os valores de outro object (como o exemplo que você dá).

Em palavras simples,

O construtor de cópia é chamado quando um novo object é criado a partir de um object existente, como uma cópia do object existente. E o operador de atribuição é chamado quando um object já inicializado recebe um novo valor de outro object existente.

Exemplo-

 t2 = t1; // calls assignment operator, same as "t2.operator=(t1);" Test t3 = t1; // calls copy constructor, same as "Test t3(t1);"