¿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