C++中对象的构造顺序

    在前边几课,我们知道了类的构造函数,在生成类对象时会被自动调用,但是假如我们定义多个对象,那么这些定义的对象,他们的构造函数执行的顺序是怎样的?换句话说就是类对象的构造顺序是怎样的?

    我们来直接揭晓答案吧,这里我共分为3中情况
    -全局区定义的对象的构造顺序是不确定的,不同的编译器使用不同的构造规则
    -局部对象:当程序执行流到达对象构造语句时进行构造
    -对象:当程序执行流执行到new关键字时创建对象,new创建对象时会自动调用构造函数

#include <iostream>
#include <string>

using namespace std;

class test
{
private:
    string m_str;
	
public:

    test(string str): m_str(str)
    {
    	cout << m_str << endl;
    }
};

test t1("t1");	//全局区定义对象
test t2("t2");
test t3("t3");

int main()
{
    //局部区栈空间定义对象
    test t4("t4");
    if (true)
    {
    	test t5("t5");
    }
    else
    {
    	test t6("t6");
    }

    //堆空间定义对象
    test *pt7 = NULL;
    test *pt8 = NULL;

    pt8 = new test("pt8");
    pt7 = new test("pt7");

    system("pause");
}

上边代码我们分别在全局区、栈区、堆空间进行对象的定义,编译输出如下:


其中t1 ~ t3在全局区,构造顺序根据编译器而定(这里使用的时vs2010);t4~t6是在栈区定义的对象,程序执行流为t4然后t5,t6没执行到,所以构造的顺序为t4->t5;pt7~pt8是在堆空间定义的对象,但是我们先对pt8使用的关键字new,即先生成pt8对应的对象,所以构造顺序是先构造pt8,再构造pt7.

总结
    -局部对象的构造顺序依赖于程序的执行流
    -堆对象的构造顺序依赖于new关键字的使用顺序
    -全局区对象的构造顺序不确定,依据具体编译器的实现

猜你喜欢

转载自blog.csdn.net/lms1008611/article/details/81320926
今日推荐