C++类细节梳理之成员初始化列表

本文介绍了如何在C++中使用成员初始化列表优化构造函数,包括常量成员、引用类型的初始化,以及当缺少无参构造函数时的处理。实例演示了如何正确使用初始化列表,避免错误并结合其他语句执行。
摘要由CSDN通过智能技术生成

成员初始化列表

语法

成员初始化器列表紧接在构造函数的括号之后,以冒号开头,后跟一系列以逗号分隔的成员初始化器。如果使用初始化列表将会直接进行拷贝构造,不用默认构造再赋值,在某些情况下可以加快程序运行效率。

具体怎么写看代码:

class Pig
{
private:
    const std::string name;
    int age;
};

Pig::Pig(std::string n, int a) : name(n), age(a){}

冒号后接类中的成员,括号内写传入的形参对其进行初始化。

值得一提的是:最好养成按照类中的声明顺序进行初始化的习惯。因为先声明的成员会先初始化,所以初始化顺序不一样的话可能出错。

必须要用的初始化器列表的时候

  1. 常量成员。因为常量成员只能初始化不能进行赋值,所以必须放在初始化器列表里面。
  2. 引用类型。因为引用必须在定义的时候初始化,并且不能重新赋值,所以必须使用初始化器。
  3. 缺少无参构造函数的类成员。由于该类成员缺少无参构造函数,必须使用有参构造函数初始化,初始化列表恰好可以使用有参构造函数初始化。

下面是一个例子:

class NumberDispaly {
private:
	const int limit;
	int value;
public:
	NumberDispaly() = default;
	NumberDispaly(int,int=0);
};

class ClockDisplay {
private:
	NumberDispaly hour;
	NumberDispaly minute;
public:
	ClockDisplay();                       
	ClockDisplay(int hour,int minute);               
};

我们注意到ClockDisplay中的成员为NumberDispaly类,所以在写ClockDisplay的构造函数时应该使用初始化器列表

ClockDisplay::ClockDisplay() : hour(24, 0), minute(60, 0){}                       
ClockDisplay::ClockDisplay(int hour,int minute): hour(24, hour), minute(60, minute){}

 若未使用初始化列表则会出现以下报错:

error: use of deleted function 'NumberDispaly::NumberDispaly()'

初始化列表的结合使用

我们注意到,在初始化列表之后还有一个大括号

Test() : k(10) {}

这个大括号并不是摆设,你可以在大括号中添加内容,这样在调用该构造函数时也会一并执行括号内的语句。k为常量成员所以必须使用初始化器列表,i,j则可以在之后进行赋值。

class Test
{
    int i;
    int j;
    const int k;
public:
    Test() : k(10)
    {
        std::cout << "invoke consttuctor!" << std::endl;
        i = 1;
        j = 2;
    }
};

由于学习不精,文章有不正确的地方望读者指正。

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值