在上一节中我们学习了初始化列表的使用,初始化列表的初始化顺序与变量的声明顺序一致,而在C++中类可以定义多个对象,这些对象的构造顺序是怎么样的呢?
21.1 局部对象的构造顺序
当程序执行流到达对象定义的语句时进行构造
#include <iostream>
using namespace std;
class TestI
{
private:
int i;
public:
TestI(int i)
{
cout << i << endl;
}
};
int main()
{
TestI i1(1);
TestI i2(2);
TestI i3(3);
return 0;
}
结果:
1
2
3
21.2 堆对象的构造顺序
- 当程序执行流到达new语句时创建对象
- 使用new创建对象将自动触发构造函数的调用
#include <iostream>
using namespace std;
class TestI
{
private:
int i;
public:
TestI(int i)
{
cout << i << endl;
}
};
int main()
{
TestI *i1 = new TestI(1);
TestI* i2 = new TestI(21);
TestI* i3 = new TestI(3);
return 0;
}
结果:
1
21
3
21.3全局对象的构造顺序
- 对象的构造顺序是不确定的
- 不同的编译器使用不同的规则确定构造顺序
#include <iostream>
using namespace std;
class TestI
{
private:
int i;
public:
TestI(int i)
{
cout << i << endl;
}
};
TestI i1(1);
TestI i2(7);
TestI i3(9);
int main()
{
return 0;
}
结果:
1
7
9
这里结果还是按照顺序运行,这里使用的开发平台是Visual Studio2019,这里就不测试其他平台了。
21.4小结:
- 局部对象的构造顺序依赖于程序的执行流
- 堆对象的构造顺序依赖于new的使用顺序
- 全局对象的构造顺序是不确定的