对象的构造顺序

C++中的类可以定义多个对象?
那么对象的构造顺序是怎样的?

对于局部对象:
当程序执行流到达对象的定义语句时进行构造

#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 = i; // Test(int i): 0
        
    while( i < 3 )
    {
        Test a2 = ++i; // Test(int i): 1, 2, 3
    }
goto End;       
        Test a(100);
End:
    printf("a.mi = %d\n", a.getMi());   //因为goto语句跳过了对象初始化,改变了程序执行流,造成灾难性的后果
    return 0;
}

对于堆对象
当程序执行流到达new语句时创建对象
使用new创建对象将自动触发·构造函数的调用

#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 = 1;
    Test* a1 = new Test(i);

    while(++i < 10)
    {
        if(i % 2)
            new Test(i);
    }

    if(i < 4)
    {
        new Test(*a1);    //调用构造函数,使用对象初始化
    }
    else
    {
        new Test(*a1);
    }
    return 0;
}

对于全局对象
对象的构造顺序是不确定的
不同的编译器使用不同的规则确定构造顺序
所以在以后开发中要避免全局对象的相互依赖,全局变量也是


版权声明:本文为weixin_46571142原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。