跳到主要内容

C++11 统一的初始化

新类型

C++11新增了类型 long longunsigned long long,以支持64位或是更宽的整形

还新增了 char16_tchar32_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作为参数的构造函数,则初始化列表语法就只能用于该构造函数。

STLvector 类提供了将 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 来简化代码声明