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

Resuelto alan.chen asked hace 12 años • 8 respuestas

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 memoria del constructor de tareas y del constructor de copias.

alan.chen avatar Jul 29 '12 08:07 alan.chen
Aceptado

Se utiliza un constructor de copia para inicializar un objeto previamente no inicializado a partir de los datos de algún otro objeto.

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

Por ejemplo:

A aa;
A a = aa;  //copy constructor

Un operador de asignación se utiliza para reemplazar los datos de un objeto previamente inicializado con los datos de algún otro objeto.

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

Por ejemplo:

A aa;
A a;
a = aa;  // assignment operator

Podría reemplazar la construcción de copia por construcción predeterminada más 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 algún recurso manualmente. En ese caso, según La Regla de Tres , es muy probable que también necesites el otro más un destructor).

sbi avatar Jul 29 '2012 02:07 sbi

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

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

Ejemplo de operador de asignación:

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

Ejemplo de constructor de copias:

Base obj1(5);
Base obj2 = obj1; //calls copy constructor
Arun avatar Jul 23 '2013 12:07 Arun