[Resumo do aprendizado de análise aprofundada em C ++] 21 Ordem de construção do objeto
Autor CodeAllen , indique a fonte
1. A ordem da construção do objeto para objetos locais
- Construa quando o fluxo de execução do programa atingir a instrução de definição do objeto, definição de objeto-> construção
Qual é a ordem da construção do objeto no programa a seguir?
Ordem de construção de objetos locais
#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. Ordem de construção de objetos dois para objetos de heap
- Crie um objeto quando o fluxo de execução do programa atingir a nova instrução
- Usar new para criar um objeto acionará automaticamente uma chamada para o construtor
Qual é a ordem da construção do objeto no programa a seguir?
Ordem de construção de objetos de heap
#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. A ordem de construção de objetos para objetos globais
-
A ordem de construção do objeto é incerta (quando vários arquivos definem a mesma variável global)
-
Compiladores diferentes usam regras diferentes para determinar a ordem de construção
-
Isso requer evitar a interdependência de variáveis globais, portanto, use variáveis globais o mínimo possível
Ordem de construção de objetos globais
#include "test.h"
Test t4("t4"); //
int main()
{
Test t5("t5");
}
Resumo
A ordem de construção dos objetos locais depende do fluxo de execução do programa.A
ordem de construção dos objetos heap depende da ordem de uso de
new.A ordem de construção dos objetos globais é incerta.