[Resumo do aprendizado de análise aprofundada em C ++] 21 Ordem de construção do objeto

[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?
Insira a descrição da imagem aqui
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?
Insira a descrição da imagem aqui
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.

Publicado 315 artigos originais · elogiou 937 · 650.000 visualizações

Acho que você gosta

Origin blog.csdn.net/super828/article/details/102758962
Recomendado
Clasificación