¿Cuándo se llama a los constructores?

¿Cuándo se llama a los constructores para diferentes tipos de objetos como global, local, local estático, dinámico? 
1) Objetos globales: para un objeto global, se llama al constructor antes de llamar a main(). Por ejemplo, vea el siguiente programa y salida: 
 

C

#include<iostream>
using namespace std;
 
class Test
{
public:
  Test();
};
 
Test::Test()  {
    cout << "Constructor Called \n";
}
 
Test t1;
 
int main() {
    cout << "main() started\n";
    return 0;
}
/* OUTPUT:
      Constructor Called
      main() started
*/

2) Alcance de función o bloque (variables automáticas y constantes) Para un objeto local no estático, se llama al constructor cuando la ejecución alcanza el punto donde se declara el objeto. Por ejemplo, vea el siguiente programa y salida: 
 

C

using namespace std;
 
class Test
{
public:
  Test();
};
 
Test::Test()  {
    cout << "Constructor Called \n";
}
 
void fun() {
  Test t1;
}
 
int main() {
    cout << "Before fun() called\n";
    fun();
    cout << "After fun() called\n";
    return 0;
}
/* OUTPUT:
       Before fun() called
       Constructor Called
       After fun() called
*/

Para un objeto estático local, la primera vez (y solo la primera vez) la ejecución alcanza el punto donde se declara el objeto. Por ejemplo, la salida del siguiente programa es:
 

C

#include<iostream>
using namespace std;
 
class Test
{
public:
  Test();
};
 
Test::Test()  {
    cout << "Constructor Called \n";
}
 
void fun() {
  static Test t1;
}
 
int main() {
    cout << "Before fun() called\n";
    fun();
    cout << "After fun() called\n";
    fun();  //constructor is not called this time.
    return 0;
}
/* OUTPUT
       Before fun() called
       Constructor Called
       After fun() called
*/

3) Ámbito de clase: cuando se crea un objeto, el compilador se asegura de que se llame a los constructores de todos sus subobjetos (su miembro y objetos heredados). Si los miembros tienen constructores predeterminados o un constructor sin parámetro, estos constructores se llaman automáticamente; de ​​lo contrario, se puede llamar a los constructores parametrizados usando Initializer List . Por ejemplo, vea PROGRAMA 1 y PROGRAMA 2 y su salida.
 

C

// PROGRAM 1: Constructor without any parameter
#include<iostream>
using namespace std;
 
class A
{
public:
  A();
};
 
A::A() {
    cout << "A's Constructor Called \n";
}
 
class B
{
  A t1;
public:
  B();
};
 
B::B() {
    cout << "B's Constructor Called \n";
}
 
int main() {
    B b;
    return 0;
}
/* OUTPUT:
      A's Constructor Called
      B's Constructor Called
*/

C

// PROGRAM 2: Constructor with parameter (using initializer list)
#include <iostream>
using namespace std;
 
class A
{
public:
    int i;
    A(int );
};
 
A::A(int arg)
{
    i = arg;
    cout << "A's Constructor called: Value of i: " << i << endl;
}
 
// Class B contains object of A
class B
{
    A a;
public:
    B(int );
};
 
B::B(int x):a(x)
{
    cout << "B's Constructor called";
}
 
int main()
{
    B obj(10);
    return 0;
}
/* OUTPUT
       A's Constructor called: Value of i: 10
       B's Constructor called
*/

4) Objetos dinámicos: para un objeto asignado dinámicamente, el operador new invoca al constructor. Por ejemplo, vea el siguiente programa y salida.
 

C

#include<iostream>
 
using namespace std;
 
class Test
{
public:
  Test();
};
 
Test::Test()  {
    cout << "Constructor Called \n";
}
 
int main()
{
    cout << "Before new called\n";
    Test *t1 = new Test;
    cout << "After new called\n";
    return 0;
}
/* OUTPUT
      Before new called
      Constructor Called
      After new called
*/

Referencias:  
http://web.cs.wpi.edu/~cs2303/c10/Protected/Lectures-C10/Week5_MoreClasses.ppt
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 *