七、 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 };
posted @ 2014-12-26 15:22  击进的Cocos  阅读(259)  评论(0编辑  收藏  举报