C++ 为什么需要用构造函数初始值列表

摘要

使用构造函数初始值列表,主要因为两个方面:

  • 底层效率更高。对比下面的方法一,由于少了一步赋值操作,初始值列表效率更高。
  • 必须使用初始值列表的场合。对于const成员变量或引用,以及当成员属于某种类类型且该类没有定义默认构造函数时,必须使用初始值列表对变量进行初始化。

一句话笔记

通常我们定义一个变量时,习惯立马就将其初始化。对于类成员变量而言,我们也希望变量被定义后有一个初始值,一般有两种做法:

class CMyClass
{
public:
	CMyClass();
private:
	int i;
	const int ci;
	int &ri;
}
//方法一:在构造函数内对变量赋值(注意:变量在进入构造函数前就已经被默认初始化过)
CMyClass::CMyClass()
{
	this->i = 0;
	this->ci = 0;	//error! const量不能修改
	this->ri = i;	//error! ri是引用,没有被初始化为某个变量的别名
}

//方法二:构造函数初始值列表初始化变量
CMyClass::CMyClass() : i(0), ci(0), (i)
{
}
  • 对于方法一,变量在进入构造函数前就已经被默认初始化过,在构造函数里只是再次对其赋值而已。
  • 对于方法二,变量在进入构造函数前就已经被初始值列表初始化了,构造函数里不需要再赋值。
  • 方法一的弊端是,它其实只是赋值操作,并不是初始化;一方面其多了次赋值操作,效率比方法二低;另一方面赋值操作无法对const变量赋值,而变量的引用需要提前初始化好后才能使用。
  • 方法二的弊端是,要注意,无论给定的初始值列表顺序如何,类成员变量的初始化顺序都与其在类中出现的顺序一致;这表明一个类成员变量如果需要依靠另一个类成员变量初始化的话,这两个变量在类中的定义顺序就很关键了。

为什么需要用构造函数初始值列表

  • 底层效率更高。对比方法一,由于少了一步赋值操作,初始值列表效率更高。
  • 必须使用初始值列表的场合。对于const成员变量或引用,以及当成员属于某种类类型且该类没有定义默认构造函数时,必须使用初始值列表对变量进行初始化。

相关/参考链接

《C++ prime 第五版》p258

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值