C++11中的初始化列表

1 初始化列表

C++98/03中可以使用初始化列表对普通数组、POD类型等进行初始化。如:


image.png

但是这种初始化方式的适用性比较窄,C++11大大的增加了初始化列表的适用性,可以用于任何乐行对象的初始化。


image.png

初始化时,{}前面的等号是否书写,对初始化行为没有任何影响。

2 初始化列表使用细节

image.png

上述第二种初始化是无效的,若存在以情况之一的初始化列表将不生效:

  • 类中含有用户自定义的构造函数;
  • 类中含有private或protected的非静态成员数据;
  • 类有基类;
  • 类中有虚函数;
  • 类中有{}或者=直接初始化的非静态成员数据;

例1:含有用户自定义的构造函数

image.png

例2:类中含有private或protected的非静态成员数据;

image.png

而包含有静态成员时,可以正常初始化


image.png

例3:有基类或有虚函数

image.png

例4:类中包含{}或者=直接初始化的情况

image.png

那如何对存在上述5中情况的类使用初始化列表呢?自定义构造函数,如:

image.png

3 std::initializer_list 实现任意长度的初始化列表

image.png

上述stl的容器可以在初始化时书写任意长度的内容,因为stl的容器通过使用轻量级的类模板std::initializer_list ,实现了接收任意长度的内容。
因此,可以通过定义一个参数为std::initializer_list 的构造函数,使用户自定义的类也能够接收任意长度的内容,如:


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容