条款04 确定对象被使用前已先被初始化

本文介绍了C++中构造函数的成员初始化列表的使用方法,并对比了初始化与赋值的区别。此外还讨论了非局部静态对象初始化顺序未定义的问题,并提供了解决方案。

一、概述

手工初始化内置类型对象

构造函数的成员初始化列表

static对象的初始化:包括non-local static和local static

 

二、细节

1. 你的构造函数使用了成员初始值列表了咩

不使用初始值列表:

class A {
public:
	A(const string &s, int i)
	{
		//下面都是赋值,而非初始化 
		s = name;
		score = i;
	}
private:
	string name;
	int score;
};

使用初始值列表:

class A {
public:
	A(const string &s, int i) :name(s), score(i)	{}
private:
	string name;
	int score;
}; 

C++规定,对象的成员变量的初始化动作发生在进入构造函数体之前,即上面那个版本的各成员会先被默认初始化,然后才进入函数体执行赋值操作。

补充:如果成员变量是const或references,那它们一定要初始化,而不能赋值!

2. 不同文件里的non-local static对象的初始化顺序是未定义的

我们可以将每个non-local static对象用一个返回其引用的函数封装起来,这样它就像local static对象了,至少函数被调用时它会被初始化。

 

转载于:https://www.cnblogs.com/xzxl/p/7845725.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值