[Resumen de aprendizaje de análisis profundo de C ++] 21 Orden de construcción de objetos
1. El orden de construcción de objetos para objetos locales.
- Construya cuando el flujo de ejecución del programa alcance la declaración de definición del objeto, definición de objeto-> construcción
¿Cuál es el orden de construcción de objetos en el siguiente programa?
Orden de construcción de objetos locales.
#include <stdio.h>
class Test
{
private:
int mi;
public:
Test(int i)
{
mi = i;
printf("Test(int i): %d\n", mi);
}
Test(const Test& obj)
{
mi = obj.mi;
printf("Test(const Test& obj): %d\n", mi);
}
};
int main()
{
int i = 0;
Test a1 = i; //Test(int i):0
while( i < 3 )
{
Test a2 = ++i; //Test(int i):1,2,3
}
//goto End;
if( i < 4 )
{
Test a = a1; //Test(const Test& obj):0
}
else
{
Test a(100);
}
//End: //此时不会输出最后一个输出结果
return 0;
}
/*
运行结果
Test(int i): 0
Test(int i): 1
Test(int i): 2
Test(int i): 3
Test(const Test& obj): 0
*/
2. Construcción de objetos orden dos para objetos de montón
- Cree un objeto cuando el flujo de ejecución del programa alcance la nueva instrucción
- El uso de new para crear un objeto activará automáticamente una llamada al constructor
¿Cuál es el orden de construcción de objetos en el siguiente programa?
Orden de construcción de objetos de montón
#include <stdio.h>
class Test
{
private:
int mi;
public:
Test(int i)
{
mi = i;
printf("Test(int i): %d\n", mi);
}
Test(const Test& obj)
{
mi = obj.mi;
printf("Test(const Test& obj): %d\n", mi);
}
int getMi()
{
return mi;
}
};
int main()
{
int i = 0;
Test* a1 = new Test(i); // Test(int i): 0
while( ++i < 10 )
if( i % 2 )
new Test(i); // Test(int i): 1, 3, 5, 7, 9
if( i < 4 )
new Test(*a1);
else
new Test(100); // Test(int i): 100
return 0;
}
/*
运行结果
Test(int i): 0
Test(int i): 1
Test(int i): 3
Test(int i): 5
Test(int i): 7
Test(int i): 9
Test(int i): 100
*/
3. El orden de construcción de objetos para objetos globales.
-
El orden de la construcción del objeto es incierto (cuando varios archivos definen la misma variable global)
-
Los diferentes compiladores usan diferentes reglas para determinar el orden de construcción.
-
Esto requiere evitar la interdependencia de las variables globales, así que use las variables globales lo menos posible
Orden de construcción de objetos globales
#include "test.h"
Test t4("t4"); //
int main()
{
Test t5("t5");
}
Resumen
El orden de construcción de los objetos locales depende del flujo de ejecución del programa.
El orden de construcción de los objetos de montón depende del orden de uso de los nuevos.
El orden de construcción de los objetos globales es incierto.