列表初始化(list initalization)
0、课前秀
- C++98/03对于不同类型(数组,结构体,类)的初始化,有不同的方法
int i_arr[3]={1,2,3};//普通数组 initializer list
struct A
{
int x;
struct B
{
int i;
int j;
}b;
}a={1,{2,3}};//POD类型
//拷贝初始化(copy-initialization)
int i=0;
class Foo
{
public:
Foo(int){}
}foo=123; //需要拷贝构造函数
//直接初始化(direct-initialization)
int j(10);
Foo bar(123);
1、统一的初始化
int a5 = {3}; int a6 {3};
//C++98/03不具备,C++11可以直接在变量名后面跟上初始化列表Foo a3 = {123};
//虽然用了=,但仍然是列表初始化- 注意:在初始化时,
{}
前面的等于号是否书写对初始化行为没有影响。
2、列表初始化的使用细节
- 什么时候认为是聚合类型
struct Foo
{
int x;
double y;
int z;
Foo(int,int){}
};
Foo foo {1,2.5,1};//error 【无法将Foo看做一个聚合类型】
- 还是有点坑,没有完全get到
3.1、任意长度的 初始化列表
3.2、std::initializer_list的一些细节
4、防止类型收窄
- 类型收窄:是导致数据内容发生变化或者精度丢失的隐式类型转换。
struct Foo
{
Foo(int i) {std::cout<<i<<std::endl;}
};
Foo foo(1.2); //能正常编译,但i却不能完整地保存一个浮点型的数据
- 隐式类型转换中,遇到类型收窄的情况,初始化列表就不会允许这种转换发生,但不同的编译器情况不太一样。
ReadMe
- 20200423第1版:参考《深入应用C++11》
- 没太学好。
原文链接: https://www.cnblogs.com/fewolflion/p/12770686.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/344121
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!