[Resumen de aprendizaje de análisis profundo de C ++] 21 Orden de construcción de objetos

[Resumen de aprendizaje de análisis profundo de C ++] 21 Orden de construcción de objetos

Código de autor Allen , por favor indique la fuente

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?
Inserte la descripción de la imagen aquí
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?
Inserte la descripción de la imagen aquí
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.

Publicado 315 artículos originales · elogiado 937 · 650,000 visitas

Supongo que te gusta

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