在前边几课,我们知道了类的构造函数,在生成类对象时会被自动调用,但是假如我们定义多个对象,那么这些定义的对象,他们的构造函数执行的顺序是怎样的?换句话说就是类对象的构造顺序是怎样的?
我们来直接揭晓答案吧,这里我共分为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关键字的使用顺序
-全局区对象的构造顺序不确定,依据具体编译器的实现