Pregunta ¿Cuál es la diferencia entre el operador de asignación y el constructor de copia?


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 el constructor de copias?


76
2017-07-29 01:56


origen


Respuestas:


UN copia constructor se usa para inicializar un previamente no inicializado objeto de los datos de otros objetos.

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

Un operador de asignación se utiliza para reemplazar los datos de un previamente inicializado objeto con los datos de otros objetos.

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

Podría reemplazar la construcción de copias por construcción más construcción predeterminada, 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, por La regla de los tres, muy probablemente también necesitarás el otro más un destructor).


110
2017-07-29 02:07



La diferencia entre el constructor de copia y el operador de asignación causa mucha confusión para los nuevos programadores, pero en realidad no es tan difícil. Resumiendo:

  • Si se debe crear un objeto nuevo antes de que se produzca la copia, se utiliza el constructor de copia.
  • Si no es necesario crear un objeto nuevo antes de que se produzca la copia, se utiliza el operador de asignación.

Ejemplo para el operador de asignación:

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

Ejemplo para el constructor de copia:

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

24
2017-07-23 12:13



El primero es inicialización de copia, el segundo es solo asignación. No existe el constructor de asignaciones.

A aa=bb;

usa el constructor de copia generado por el compilador.

A cc;
cc=aa;

usa el constructor predeterminado para construir cc, y luego el * operador de asignación ** (operator =) en un objeto ya existente.

Quiero saber cómo asignar la memoria del constructor de asignaciones y el constructor de copias?

IDK a qué te refieres con asignar memoria en este caso, pero si quieres ver lo que sucede, puedes:

class A
{
public :
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

También te recomiendo que eches un vistazo a:

¿Por qué se llama el constructor de copia en lugar del constructor de conversión?

¿Cuál es la regla de tres?


18
2017-07-29 02:00



la diferencia entre un constructor de copia y un constructor de asignación es:

  1. En el caso de un constructor de copia, crea un nuevo objeto. (<classname> <o1>=<o2>)
  2. En el caso de un constructor de asignaciones, no creará ningún objeto significa que se aplica a objetos ya creados (<o1>=<o2>)

Y las funcionalidades básicas en ambos son las mismas, copiarán los datos de o2 a o1 miembro por miembro.


2
2018-01-01 12:35



Lo que @Luchian Grigore Said se implementa así

class A
{
public :
    int a;
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

void main()
{
    A sampleObj; //Calls default constructor
    sampleObj.a = 10;

    A copyConsObj  = sampleObj; //Initializing calls copy constructor

    A assignOpObj; //Calls default constrcutor
    assignOpObj = sampleObj; //Object Created before so it calls assignment operator
}

SALIDA


Constructor predeterminado


copia constructor


Constructor predeterminado


operador de asignación



1
2018-03-03 07:04



Algo para agregar sobre copy constructor:

  • Al pasar un objeto por valor, usará el constructor de copia

  • Cuando un objeto se devuelve 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 das).


1
2018-01-24 11:28



En palabras simples,

Se llama al constructor de copias 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-

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

1
2018-02-19 20:35



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 hacer que funcione como amigo a diferencia de otros operadores binarios o unarios.


1
2017-08-18 18:09