C++11 统一的初始化
新类型
C++11新增了类型 long long
和 unsigned long long
,以支持64位或是更宽的整形
还新增了 char16_t
和 char32_t
,以支持16位和32位的字符表示
新增了“原始”字符串
C++11扩大了初始化列表的适用范围,使其可以用于所有内置类型和用户定义的类型(即类与对象)。使用初始化列表时,可以添加 =
符,也可以不加
eg.
int x = {5};
double y {2.75};
short quar[5] {4, 5, 2, 76, 1};
初始化列表语法也可用于 new
表达式中
eg.
int * ar = new int [4] {2, 4, 6, 7};
创建对象时,也可使用初始化列表来调用构造函数
eg.
class Student{
private:
int age;
double height;
public:
Student (int a, double h) : age(a), height(h){
}
};
int main() {
Student s1(18, 170.25); // old style
Student s2{19, 175.86}; // C++11
Student s3 = {20, 180.09}; // C++11
}
防止缩窄
初始化列表语法可防止缩窄,即禁止将数值赋给无法储存它的数值变量
eg.
// 常规初始化允许执行可能没有意义的操作
char c1 = 1.57e27; // double to char
char c2 = 459585821; // int to char. out of range
如果使用初始化列表语法,编译器将禁止进行这样的类型转换
eg.
// compile error
char c1 {1.57e27}; // double to char
char c2 = {459585821}; // int to char. out of range
但是允许转换为更宽的类型,或是值在较窄类型的取值范围内,也允许转换为较窄的类型
eg.
// allow
char c1 {66}; // int to char. in range
double c2 = {66}; // int to double
std::initializer_list
C++11提供了模板类 initializer_list
,可将其用作构造函数的参数。如果有类接受 initializer_list
作为参数的构造函数,则初始化列表语法就只能用于该构造函数。
STL
的 vector
类提供了将 initializer_list
作为参数的构造函数
eg.
vector<int> v1(10); // v1为有10个元素的为初始化容器
vector<int> v2{10}; // v2为有1个元素值为10的容器
vector<int> v3{4, 6, 1}; // v3 3个元素为 4,6,1
头文件 initializer_list
提供了对类模板 initializer_list
,这个类包含成员brgin()
和end()
,用于获取列表范围
除用于构造函数外, initializer_list
还可用作常规函数的参数
eg.
#include<initializer_list>
double sum(std::initializer_list<double> il){
double num = 0;
for (auto i = il.begin(); i != il.end(); i++) {
num += *i;
}
return num;
}
- 这里用到了
auto
来简化代码声明