c++11 新特性之列表初始化
C++11新增了列表初始化的概念。
在C++11中可以直接在变量名后面加上初始化列表来进行对象的初始化。
列表初始化也可以用在函数的返回值上
列表初始化的一些规则:
首先说下聚合类型可以进行直接列表初始化,这里需要了解什么是聚合类型:
类型是一个普通数组,如int[5],char[],double[]等
类型是一个类,且满足以下条件:
上述代码类A不是聚合类型,无法进行列表初始化,必须以自定义的构造函数来构造对象。
上面列举了一些不是聚合类的例子,对于一个聚合类型,使用列表初始化相当于对其中的每个元素分别赋值;对于非聚合类型,需要先自定义一个对应的构造函数,此时列表初始化将调用相应的构造函数。
std::initializer_list
我们平时开发使用STL过程中可能发现它的初始化列表可以是任意长度,大家有没有想过它是怎么实现的呢,答案是std::initializer_list,看下面这段示例代码:
我想通过上面这段代码大家可能已经知道STL是如何实现的任意长度初始化了吧,这个std::initializer_list其实也可以作为函数参数。
注意:std::initializer_list<T>,它可以接收任意长度的初始化列表,但是里面必须是相同类型T,或者都可以转换为T。
列表初始化的好处
个人认为列表初始化的好处如下:
方便,且基本上可以替代括号初始化
可以使用初始化列表接受任意长度
可以防止类型窄化,避免精度丢失的隐式类型转换
什么是类型窄化,列表初始化通过禁止下列转换,对隐式转化加以限制:
从浮点类型到整数类型的转换
从 long double 到 double 或 float 的转换,以及从 double 到 float 的转换,除非源是常量表达式且不发生溢出
从整数类型到浮点类型的转换,除非源是其值能完全存储于目标类型的常量表达式
从整数或无作用域枚举类型到不能表示原类型所有值的整数类型的转换,除非源是其值能完全存储于目标类型的常量表达式
示例:
打印如下:
关于列表初始化的所有知识点就是这些,如有遗漏或者遗漏的大家积极留言哈,请持续关注~
参考资料
《深入应用c++11:代码优化与工程级应用》
https://blog.csdn.net/hailong0715/article/details/54018002
https://zh.cppreference.com/w/cpp/language/list_initialization
https://zh.cppreference.com/w/cpp/language/aggregate_initialization
更多文章,请关注我的V X 公 主 号:程序喵大人,欢迎交流。
版权声明: 本文为 InfoQ 作者【程序喵大人】的原创文章。
原文链接:【http://xie.infoq.cn/article/d33cb0d3d6bc775b8b23c7e27】。文章转载请联系作者。
评论