七、 C++11特性之统一初始化语法
C++至少有4个不同的初始化符号,有些存在重叠,括号初始化语法如下:
1 std::string s("hello"); 2 int m=int(); //default initialization
在某些情况下,你也可以使用“=”符号进行初始化:
1 std::string s="hello"; 2 int x=5;
对于POD聚合,你还可以使用大括号:
1 int arr[4]={0,1,2,3}; 2 struct tm today={0};
最后,构造函数使用成员进行初始化:
1 struct S { 2 int x; 3 S(): x(0) {} };
显然,这么多种初始化方法会引起混乱,对新手来说就更痛苦了,更糟糕的是,在C++03中,你不能初始化POD数组成员,POD数组使用new[]分配,C++11使用统一的大括号符号清理了这一混乱局面。vs2012不支持,vs2013部分支持
1 class C 2 { 3 int a; 4 int b; 5 public: 6 C(int i, int j); 7 }; 8 9 C c {0,0}; //C++11 only. Equivalent to: C c(0,0); 10 11 int* a = new int[3] { 1, 2, 0 }; //C++11 only 12 13 class X 14 { 15 int a[4]; 16 public: 17 X() : a{1,2,3,4} {} //C++11, member array initializer 18 };
关于容器,你可以和一长串的push_back()调用说再见了,在C++11中,你可以直观地初始化容器:
1 // C++11 container initializer 2 vector<string> vs={ "first", "second", "third"}; 3 map<string,long> singers ={ {"Lady Gaga", "+1 (212) 555-7890"},{"Beyonce Knowles", "+1 (212) 555-0987"}};
类似地,C++11支持类似的数据成员类内初始化:
1 class C 2 { 3 int a=7; //C++11 only 4 public: 5 C(); 6 };