初始化列表

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

construcotr代码被编译器扩张为:
Word::Word()
{
	_name.String::String();		//调用 String 的 default constructor
	String temp = String(0);	//产生暂时性对象
	_name.String::operator=(temp);	//"memberwize"地copy _name
	temp.String::~String();	//摧毁暂时性对象
	_cnt = 0;
}
以上代码效率低下

必须使用初始化列表的情况:

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


初始化列表的项目次序是由class中的member声明次序决定,而不是由initializetion list中的排列次序决定
例:
class X
{
int i;
int j ;
public :
X(int val):j(val),i(j)    //由于声明次序的缘故,initialization list中的i(j)其实比j(val)更早执行,所以会导致i无法预知其值
{}
...
}
修改后:
class X
{
public:
int i;
int j ;
public:
X(int val):j(val)
{
i = j;
}
}
类被编译器扩充为:
class X
{
public:
int i;
int j ;
public:
X(int val)
{
j= val;//initialization list中的初始化操作会被安插在构造函数的开始;
i = j;
}
}
注:编译器会对Initialization list一一处理并可能重新排序,以反映出members的声明次序,它会安插一引起代码到contructor体内,并置于任何explicit user code 之前(base class优先级高于object member)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值