统一的列表初始化
{}初始化
在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。
C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。
创建对象时也可以使用列表初始化方式调用构造函数初始化
std::initializer_list
经过上面的{}初始化列表的介绍,大家应该会有个疑问,那么这个{}整体是个什么类型呢?为什么会支持{}初始化?我们看一下下面的代码?
从上面我们可以知道,initializer_list是C++ STL库中的一个类。大家可以看标准库里面对initializer_list的介绍。
std::initializer_list使用场景:
std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=的参数,这样就可以用大括号赋值。
STL库中还有许多容器支持{}初始化,这里就不一一列举,大家有兴趣可以自己去C++标准参考文档中去看。
变量的类型推导
auto
在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。C++11中废弃auto原来的用法,将其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。
decltype
关键字decltype将变量的类型声明为表达式指定的类型。
新增加的容器
array
array是一个容器,可以开一个固定空间的数组。
它跟我们C语言学的开一个固定数组的空间并没有什么区别。
但是又因为C++兼容C语言,所以上面的那个语法就比较鸡肋,没有太大用处。
但是有一个好处就是,它对越界检查比较严格。
forward_list
forward_list是一个单链表,只支持从前往后遍历,不支持从后往前遍历。