Recomendado, 2024

La Elección Del Editor

Diferencia entre el constructor de copias y el operador de asignación en C ++

El constructor de copia y el operador de asignación, son las dos formas de inicializar un objeto utilizando otro objeto. La diferencia fundamental entre el constructor de copia y el operador de asignación es que el constructor de copia asigna memoria separada a ambos objetos, es decir, el objeto de destino recién creado y el objeto de origen. El operador de asignación asigna la misma ubicación de memoria al objeto de destino recién creado, así como objeto fuente

Estudiemos la diferencia entre el constructor de copia y el operador de asignación.

Gráfica comparativa

Bases para la comparaciónCopia ConstructorOperador de Asignaciones
BASICEl constructor de copia es un constructor sobrecargado.El operador de asignación es un operador bit a bit.
SentidoEl constructor de copia inicializa el nuevo objeto con un objeto ya existente.El operador de asignación asigna el valor de un objeto a otro objeto que ya existen.
Sintaxisclass_name (cont class_name & object_name) {
// cuerpo del constructor
}
class_name Ob1, Ob2;
Ob2 = Ob1;
Invoca(1) El constructor de copias invoca cuando un nuevo objeto se inicializa con uno existente.
(2) El objeto pasado a una función como un parámetro no de referencia.
(3) El objeto es devuelto desde la función.
El operador de asignación se invoca solo cuando se asigna un objeto nuevo al objeto existente.
Asignación de memoriaTanto el objeto de destino como el objeto de inicialización comparten las diferentes ubicaciones de memoria.Tanto el objeto de destino como el objeto de inicialización comparten la misma memoria asignada.
DefectoSi no define ningún constructor de copia en el programa, el compilador de C ++ implícitamente proporciona uno.Si no sobrecarga el operador "=", se realizará una copia a nivel de bits.

Definición de Copia Constructor

Un "constructor de copia" es una forma de un constructor sobrecargado . Un constructor de copia solo se llama o invoca para propósitos de inicialización. Un constructor de copia inicializa el objeto recién creado por otro objeto existente. Cuando se utiliza un constructor de copia para inicializar el objeto de destino recién creado, el objeto de destino y el objeto de origen comparten una ubicación de memoria diferente. Los cambios realizados en el objeto de origen no se reflejan en el objeto de destino. La forma general del constructor de copia es

 nombre_clase (nombre_clase y nombre_objeto) {. // cuerpo del constructor de copia. } // object_name se refiere al objeto en el lado derecho de la inicialización. 

Si el programador no crea un constructor de copia en un programa de C ++, el compilador proporciona implícitamente un constructor de copia. Un constructor de copia implícita proporcionado por el compilador hace la copia de miembros del objeto fuente. Pero, a veces, la copia de miembros no es suficiente, ya que el objeto puede contener una variable de puntero. Copiar los medios de una variable de puntero, copiamos la dirección almacenada en la variable de puntero, pero no queremos copiar la dirección almacenada en la variable de puntero, en cambio, queremos copiar a qué punteros apunta. Por lo tanto, existe la necesidad de un 'constructor de copia' explícito en el programa para resolver este tipo de problemas.

Un constructor de copia se invoca en las siguientes tres condiciones:

  • El constructor de copia invoca cuando un nuevo objeto se inicializa con uno existente.
  • El objeto pasado a una función como un parámetro no de referencia.
  • El objeto es devuelto desde la función.

Entendamos copia constructor con un ejemplo.

 copia de clase {int num; public: copy () {} // copia del constructor por defecto (int a) {// initializing constructor num = a; } copiar (copiar & c) {// Copiar constructor num = c.num; } void show () {cout << num; }}; int main () {copia A (200); // Objeto A creado e inicializado copia B (A); // Copia constructor llamado copia C = A; // Copia constructor llamado copia D; D = A; // Copiar constructor no llamado porque el objeto D no es un objeto recién creado. // Es una operación de asignación. devuelve 0; } 

En el código anterior, había declarado explícitamente un constructor "copia (copia & c)". Se está llamando a este constructor de copia cuando el objeto B se inicializa usando el objeto A. La segunda vez que se llama cuando el objeto C se está inicializando usando el objeto A. Cuando el objeto D se inicializa usando el objeto A, no se llama al constructor de copia porque cuando D se está inicializando ya está en la existencia, no en la recién creada. Por lo tanto, aquí se invoca el operador de asignación.

Definición de operador de asignación

El operador de asignación es un operador de asignación de C ++. El operador "=" se utiliza para invocar al operador de asignación. Copia los datos en un objeto de forma idéntica a otro objeto. El operador de asignación copia un objeto a otro miembro. Si no sobrecarga el operador de asignación, realiza la copia a nivel de bits. Por lo tanto, es necesario sobrecargar el operador de asignación.

 copia de clase {int num; public: copy () {} // copia del constructor por defecto (int a) {// initializing constructor num = a; } void show () {cout << num; }}; int main () {copia A (200); // Objeto A creado e inicializado copia B (300); // Objeto B creado e inicializado B = A; // operador de asignación invocado copia C; C = A; // operador de asignación invocado return 0; } 

En el código anterior, cuando se asigna el objeto A al objeto B, el operador de asignación se está invocando ya que ambos objetos ya existen. Del mismo modo, lo mismo ocurre cuando el objeto C se inicializa con el objeto A.

Cuando se realiza la asignación a nivel de bits, el objeto comparte la misma ubicación de memoria y los cambios en un objeto se reflejan en otro objeto.

Diferencias clave entre el constructor de copias y el operador de asignación

  1. Un constructor de copia es un contructor sobrecargado donde, como operador de asignación, es un operador a nivel de bits.
  2. Usando el constructor de copia puede inicializar un nuevo objeto con un objeto ya existente. Por otro lado, un operador de asignación copia un objeto al otro objeto, los cuales ya existen.
  3. Un constructor de copia se inicializa cada vez que un nuevo objeto se inicializa con un objeto ya existente, cuando un objeto se pasa a una función como un parámetro de no referencia, o cuando se devuelve un objeto desde una función. Por otro lado, un operador de asignación se invoca solo cuando un objeto se asigna a otro objeto.
  4. Cuando un objeto se está inicializando utilizando un constructor de copia, el objeto de inicialización y el objeto inicializado comparten la ubicación de memoria diferente. Por otro lado, cuando un objeto se está inicializando mediante un operador de asignación, los objetos inicializados e inicializados comparten la misma ubicación de memoria.
  5. Si no define explícitamente un constructor de copia, el compilador proporciona uno. Por otro lado, si no sobrecarga a un operador de asignación, se realiza una operación de copia a nivel de bits.

Conclusión:

El constructor Copiar es el mejor para copiar un objeto a otro cuando el objeto contiene punteros en bruto.

Top