C++学习笔记 第21课 对象的构造顺序


在上一节中我们学习了初始化列表的使用,初始化列表的初始化顺序与变量的声明顺序一致,而在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的使用顺序
  • 全局对象的构造顺序是不确定的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值