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中情况的类使用初始化列表呢?自定义构造函数,如:
3 std::initializer_list 实现任意长度的初始化列表
image.png上述stl的容器可以在初始化时书写任意长度的内容,因为stl的容器通过使用轻量级的类模板std::initializer_list ,实现了接收任意长度的内容。
因此,可以通过定义一个参数为std::initializer_list 的构造函数,使用户自定义的类也能够接收任意长度的内容,如:
image.png
网友评论