Utilice el constructor de copias en C++

Jinku Hu 12 octubre 2023
  1. Utilice el constructor de copias para inicializar un objeto desde otro objeto del mismo tipo en C++
  2. Utilice el operador de asignación de copia para definir la sobrecarga del operador de asignación para el objeto en C++
Utilice el constructor de copias en C++

Este artículo explica varios métodos de cómo utilizar un constructor de copias en C++.

Utilice el constructor de copias para inicializar un objeto desde otro objeto del mismo tipo en C++

Hay varias operaciones en la clase denominadas colectivamente control de copia. Estas operaciones definen cómo se copian, mueven, asignan o destruyen los objetos del tipo de clase dado. En este artículo, solo nos centraremos en el constructor de copia y la asignación de copia.

El constructor de copia inicializa el objeto duplicando el valor del argumento pasado como referencia (normalmente se pasa como referencia const). No se requiere que la clase defina el constructor de copia como cualquier otra operación de control de copia porque el compilador define automáticamente las operaciones sintetizadas para las no definidas. Aún así, a menudo estos últimos pueden causar problemas. El constructor de copia sintetizada copia cada miembro del objeto de argumento en el objeto que se está creando. Puede haber miembros de algunos otros tipos de clases, que son copiados por su constructor de copias. Por el contrario, los objetos de texto integrados se copian directamente.

El siguiente código de ejemplo demuestra el comportamiento del constructor de copia de MyClass, que toma el único argumento obligatorio para el constructor de copia y luego inicializa los miembros de datos. Por otro lado, el constructor de copia puede tener argumentos adicionales, que deben ser opcionales y tener valores predeterminados.

Cuando el objeto de tipo MyClass se crea al principio, se invoca el constructor predeterminado; sin embargo, si asignamos m1 a la variable m3 recién creada, se llama al constructor de copia. La última operación también se llama inicialización de copia, que puede utilizar un constructor de copia o mover un constructor (discutido en otro artículo).

#include <iostream>

using std::cout;
using std::endl;
using std::pair;

class MyClass {
 private:
  int n1{};
  int n2{};

 public:
  MyClass(int x, int y) : n1(x), n2(y) {
    cout << "Constructor 1 is called" << endl;
  };

  MyClass(const MyClass& src) {
    cout << "Copy Constructor is called " << endl;
    n1 = src.n1;
    n2 = src.n2;
  }

  auto getPair() { return pair<int, int>(n1, n2); }

  ~MyClass() = default;
};

int main() {
  MyClass m1(12, 21);
  cout << "------------------" << endl;
  MyClass m2(11, 33);
  cout << "------------------" << endl;
  MyClass m3 = m1;
  cout << "------------------" << endl;

  cout << m1.getPair().first << m1.getPair().second << endl;
  cout << m2.getPair().first << m2.getPair().second << endl;
  cout << m3.getPair().first << m3.getPair().second << endl;

  return EXIT_SUCCESS;
}

Producción :

Constructor 1 is called
------------------
Constructor 1 is called
------------------
Copy Constructor is called
------------------
1221
1133
1221

Utilice el operador de asignación de copia para definir la sobrecarga del operador de asignación para el objeto en C++

El operador de asignación de copia define cómo asignar objetos del mismo tipo. El compilador también sintetiza esta operación si el usuario no la define explícitamente. La asignación de copias se describe de manera similar a otras funciones de sobrecarga del operador. Toma un argumento del mismo tipo que la clase y normalmente devuelve la referencia al operando de la izquierda. Un operador de asignación de copia debe definirse como una función miembro.

El siguiente fragmento de código agrega el operador de asignación de copia para MyClass y lo invoca mientras asigna el objeto m2 a m1.

#include <iostream>

using std::cout;
using std::endl;
using std::pair;

class MyClass {
 private:
  int n1{};
  int n2{};

 public:
  MyClass(int x, int y) : n1(x), n2(y) {
    cout << "Constructor 1 is called" << endl;
  };

  MyClass(const MyClass& src) {
    cout << "Copy Constructor is called " << endl;
    n1 = src.n1;
    n2 = src.n2;
  }

  MyClass& operator=(const MyClass& src) {
    cout << "Copy Assignment is called " << endl;
    n1 = src.n1;
    n2 = src.n2;
    return *this;
  }

  auto getPair() { return pair<int, int>(n1, n2); }

  ~MyClass() = default;
};

int main() {
  MyClass m1(12, 21);
  cout << "------------------" << endl;
  MyClass m2(11, 33);
  cout << "------------------" << endl;
  MyClass m3 = m1;
  cout << "------------------" << endl;
  m1 = m2;
  cout << "------------------" << endl;

  cout << m1.getPair().first << m1.getPair().second << endl;
  cout << m2.getPair().first << m2.getPair().second << endl;
  cout << m3.getPair().first << m3.getPair().second << endl;

  return EXIT_SUCCESS;
}

Producción :

Constructor 1 is called
------------------
Constructor 1 is called
------------------
Copy Constructor is called
------------------
Copy Assignment is called
------------------
1221
1133
1221
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Constructor