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看做一个聚合类型】
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》