2.4成员们的初始化队伍

在下列情况下,为了让你的程序能够被顺利编译,你必须使用member initialization list

  1. 当初始化一个reference member时;
  2. 当初始化一个const member时;
  3. 当调用一个base class的constructor,而它拥有一组参数时
  4. 当调用一个member classconstructor,而它拥有一组参数时;

考虑如下代码:

class Word {
	string _name;
	int    _cnt;
public:
	Word() {
		_name = 0;
		_cnt = 0;
	}
};

以下为上述构造函数代码的内部扩张结果:

Word::Word(/*this 指针*/) {
	// 调用string的default constructor
	_name.string::string();
	// 产生临时对象
	string temp = string(0);
	// memberwise的拷贝_name
	_name.string::operator=(temp);
	// 摧毁临时对象
	temp.string::~string();
	_cnt = 0;
}

对代码反复审查并且修正,可以得到一个更有效率的实现方法:

Word::Word(): _name(0){
	_cnt = 0;
}

它会被扩张成这个样子:

Word::Word(/*this 指针*/){
	// 调用string(int) constructor
	_name.string::string(0)
	_cnt = 0;
}

list中的项目顺序是由class中的members声明顺序决定的,不是由initialization list中的排列顺序决定的; 如:

Class X {
	int i;
	int j;
public:
	X(int val) : j(val), i(j){}
};

上述代码看起来像是要把j设初始值为val,再把i设初值为j.问题在于,由于声明顺序的缘故,initialization list中的i(j)其实比j(val)更早执行.

建议的做法是总是把一个member的初始化操作和另一个放在一起:

X::X(int val) : j(val) {
	i = j;
}

还有一个有趣的问题,initialization list中的项目被安插到constructor,会继续保持声明顺序么?也就是说j的初始化操作会被安插在explicit user assigment操作(i=j)之前还是之后?;答案是之前,因为initialization list的项目被放在explicit user code之前;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值