Salida del programa C++ | conjunto 13

Prediga la salida del siguiente programa C++.

#include<iostream>
using namespace std;
  
class A
{
    // data members of A
public:
    A ()           { cout << "\n A's constructor"; /* Initialize data members */ }
    A (const A &a) { cout << "\n A's Copy constructor";  /* copy data members */}
    A& operator= (const A &a) // Assignemt Operator
    {
        // Handle self-assignment:
        if(this == &a) return *this;
  
        // Copy data members
        cout << "\n A's Assignment Operator";  return *this;
    }
};
  
class B
{
    A a;
    // Other members of B
public:
    B(A &a) { this->a = a; cout << "\n B's constructor"; }
};
  
int main()
{
    A a1;
    B b(a1);
    return 0;
}

Producción:

 A's constructor
 A's constructor
 A's Assignment Operator
 B's constructor

La primera línea de salida se imprime con la declaración «A a1;» en principal().
La segunda línea se imprime cuando se inicializa el miembro ‘a’ de B. Esto es importante.
La tercera línea está impresa por la declaración “this->a = a;” en el constructor de B.
La cuarta línea se imprime mediante la instrucción cout en el constructor de B.

Si observamos más de cerca el código anterior, el constructor de la clase B no es eficiente ya que el miembro ‘a’ se construye primero con el constructor predeterminado y luego los valores del parámetro se copian usando el operador de asignación. Puede ser una preocupación cuando la clase A es grande, lo que generalmente ocurre con muchas clases prácticas. Consulte el siguiente código optimizado.

#include<iostream>
using namespace std;
  
class A
{
    // data members of A
public:
    A()           { cout << "\n A's constructor"; /* Initialize data members */ }
    A(const A &a) { cout << "\n A's Copy constructor"; /* Copy data members */ }
    A& operator= (const A &a) // Assignemt Operator
    {
        // Handle self-assignment:
        if(this == &a) return *this;
  
        // Copy data members
        cout << "\n A's Assignment Operator";  return *this;
    }
};
  
class B
{
    A a;
    // Other members of B
public:
    B(A &a):a(a) {  cout << "\n B's constructor"; }
};
  
int main()
{
    A a;
    B b(a);
    return 0;
}

Producción:

 A's constructor
 A's Copy constructor
 B's constructor

El constructor de la clase B ahora usa la lista de inicializadores para inicializar su miembro ‘a’. Cuando se utiliza la lista de inicializadores, el miembro ‘a’ de la clase B se inicializa directamente desde el parámetro. Entonces se reduce una llamada al constructor de A.
En general, es una buena idea utilizar la lista de inicializadores para inicializar todos los miembros de una clase, ya que ahorra una asignación adicional de miembros. Ver el punto 6 de este post para más detalles.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *