No entiendo la diferencia entre el constructor de asignaciones y el constructor de copias en C ++. Es así:
class A {
public:
A() {
cout << "A::A()" << endl;
}
};
// The copy constructor
A a = b;
// The assignment constructor
A c;
c = a;
// Is it right?
Quiero saber cómo asignar la memoria del constructor de asignaciones y copiar el constructor.
Respuestas:
Un constructor de copia se usa para inicializar un objeto previamente no inicializado a partir de los datos de algún otro objeto.
Por ejemplo:
Un operador de asignación se utiliza para reemplazar los datos de un objeto previamente inicializado con los datos de algún otro objeto.
Por ejemplo:
Podría reemplazar la construcción de la copia por la construcción predeterminada más la asignación, pero eso sería menos eficiente.
(Como nota al margen: Mis implementaciones anteriores son exactamente las que el compilador le otorga de forma gratuita, por lo que no tendría mucho sentido implementarlas manualmente. Si tiene una de estas dos, es probable que esté administrando manualmente algún recurso. En ese caso, según la regla de tres , es muy probable que también necesite el otro más un destructor).
fuente
=default;
.= default
donde se necesita un ctor predeterminado: simplemente implementar un cuerpo vacío por nosotros mismos todavía cuenta como un ctor definido por el usuario y, por lo tanto (en un nivel Standardese ) no es trivial y descalifica al tipo de las clasificaciones que requieren un ctor trivial.:)
¿Intentarás explicar de nuevo de qué estás hablando?La diferencia entre el constructor de copia y el operador de asignación causa mucha confusión para los programadores nuevos, pero en realidad no es tan difícil. Resumiendo:
Ejemplo de operador de asignación:
Ejemplo de constructor de copias:
fuente
vector <A> v3
y luegov3 = v2
(dóndev2
está un elemento previamente declarado y que contienevector<A>
) llama alA
constructor de copia explícito en lugar deloperator=
? Esperabaoperator=
que me llamaran en lugar decopy constructor
porque miv3
objeto ya estaba declarado en el momento en que hice la tareaLa primera es la inicialización de la copia, la segunda es solo la asignación. No existe el constructor de asignaciones.
usa el constructor de copia generado por el compilador.
usa el constructor predeterminado para construir
cc
, y luego el * operador de asignación ** (operator =
) en un objeto ya existente.IDK lo que quiere decir con asignar memoria en este caso, pero si quiere ver qué sucede, puede:
También te recomiendo que eches un vistazo a:
¿Por qué se llama al constructor de copia en lugar del constructor de conversión?
¿Qué es la regla de tres?
fuente
En pocas palabras
Se llama al constructor de copia cuando se crea un nuevo objeto a partir de un objeto existente, como una copia del objeto existente. Y se llama al operador de asignación cuando a un objeto ya inicializado se le asigna un nuevo valor de otro objeto existente.
Ejemplo-
fuente
Lo que @Luchian Grigore Said se implementa así
SALIDA
Constructor predeterminado
constructor de copias
Constructor predeterminado
operador de asignación
fuente
la diferencia entre un constructor de copia y un constructor de asignación es:
<classname> <o1>=<o2>
)<o1>=<o2>
).Y las funcionalidades básicas en ambos son las mismas, copiarán los datos de o2 a o1 miembro por miembro.
fuente
Quiero agregar un punto más sobre este tema. "La función de operador del operador de asignación debe escribirse solo como una función miembro de la clase". No podemos hacerlo como una función amiga a diferencia de otros operadores binarios o unarios.
fuente
Algo que agregar sobre el constructor de copias:
Al pasar un objeto por valor, usará el constructor de copia
Cuando se devuelve un objeto de una función por valor, usará el constructor de copia
Al inicializar un objeto usando los valores de otro objeto (como el ejemplo que da).
fuente