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 memória do construtor de atribuição e do construtor de cópia?
Respostas:
Um construtor de cópia é usado para inicializar um objeto não inicializado anteriormente a partir dos dados de algum outro objeto.
Por exemplo:
Um operador de atribuição é usado para substituir os dados de um objeto inicializado anteriormente pelos dados de algum outro objeto.
Por exemplo:
Você poderia substituir a construção de cópia por construção padrão mais atribuição, mas isso seria menos eficiente.
(Como uma observação lateral: Minhas implementações acima são exatamente as que o compilador concede a você gratuitamente, então não faria muito sentido implementá-las manualmente. Se você tiver uma dessas duas, é provável que esteja gerenciando algum recurso manualmente. Nesse caso, de acordo com a Regra de Três , você provavelmente também precisará do outro mais um destruidor.)
fonte
=default;
.= default
usá-las onde um ctor padrão é necessário: simplesmente implementar um corpo vazio por nós mesmos ainda conta como um ctor definido pelo usuário e, portanto (em um nível Standardese ) não é trivial e desqualifica o tipo de classificações que requerem um ctor trivial.:)
Você tentará explicar novamente sobre o que está falando?A diferença entre o construtor de cópia e o operador de atribuição causa muita confusão para novos programadores, mas realmente não é tão difícil. Resumindo:
Exemplo para operador de atribuição:
Exemplo de construtor de cópia:
fonte
vector <A> v3
e entãov3 = v2
(ondev2
está um elemento previamente declarado e contendovector<A>
) chama meuA
construtor de cópia explícito em vez deoperator=
? Eu esperavaoperator=
ser chamado em vez decopy constructor
porque meuv3
objeto já havia sido declarado no momento em que fiz a atribuiçãoO primeiro é a inicialização da cópia, o segundo é apenas atribuição. Não existe construtor de atribuição.
usa o construtor de cópia gerado pelo compilador.
usa o construtor padrão para construir
cc
e, em seguida, o * operador de atribuição ** (operator =
) em um objeto já existente.IDK o que você quer dizer com alocar memória neste caso, mas se quiser ver o que acontece, você pode:
Eu também recomendo que você dê uma olhada em:
Por que o construtor de cópia é chamado em vez do construtor de conversão?
Qual é a regra de três?
fonte
Em palavras simples,
O construtor de cópia é chamado quando um novo objeto é criado a partir de um objeto existente, como uma cópia do objeto existente. E o operador de atribuição é chamado quando um objeto já inicializado é atribuído a um novo valor de outro objeto existente.
Exemplo-
fonte
O que @Luchian Grigore Said é implementado assim
RESULTADO
construtor padrão
construtor de cópia
construtor padrão
operador de atribuição
fonte
a diferença entre um construtor de cópia e um construtor de atribuição é:
<classname> <o1>=<o2>
)<o1>=<o2>
).E as funcionalidades básicas em ambos são iguais, eles irão copiar os dados de o2 para o1 membro a membro.
fonte
Eu quero adicionar mais um ponto sobre este tópico. "A função de operador do operador de atribuição deve ser escrita apenas como uma função de membro da classe." Não podemos torná-la uma função amiga ao contrário de outro operador binário ou unário.
fonte
Algo a acrescentar sobre o construtor de cópia:
Ao passar um objeto por valor, ele usará o construtor de cópia
Quando um objeto é retornado de uma função por valor, ele usará o construtor de cópia
Ao inicializar um objeto usando os valores de outro objeto (conforme o exemplo que você deu).
fonte