在 c++11 之前,只能對結構體或類的靜態常量成員進行就地初始化,其他的不行。
class c
class c
; // or int b=; c++11 only
int c(7); // error
};
注意,小括號初始化方式不能用於就地初始化。
c++11 支援了就地初始化非靜態資料成員的同時,初始化列表的方式也被保留下來,也就是說既可以使用就地初始化,也可以使用初始化列表來完成資料成員的初始化工作。當二者同時使用時並不衝突,初始化列表發生在就地初始化之後,即最終的初始化結果以初始化列表為準。參考如下**:
#include using namespace std;
class mem
int m1 = 1;
int m2 = ;
};int main()
;studnet s=; // 純資料(plain of data,pod)型別物件
studnet sarr=,}; // pod陣列
// 建構函式的初始化列表
class class
};
這麼多的物件初始化方式,不僅增加了學習成本,也使得**風格有較大出入,影響了**的可讀性和統一性。從c++11開始,對列表初始化(list initialization)的功能進行了擴充,可以作用於任何型別物件的初始化,至此,列表初始化方式完成了天下大一統。
class test
;
};test t; // c++11 only,相當於 test t(0,0);
test* pt=new test; // c++11 only,相當於 test* pt=new test(1,2);
int* a = new int[3]; // c++11 only
此外,c++11 列表初始化還可以應用於容器,終於可以擺脫 push_back() 呼叫了,c++11 中可以直觀地初始化容器:
// c++11 container initializer
vectorvs;
mapsingers,};
可以將 c++11 的列表初始化作為統一的初始化方式,既降低了記憶難度,也提高的**的統一度。
[1] c++ 11 新特性
[2] 深入理解c++11[m].2.7快速初始化成員變數
c 11 就地初始化與列表初始化
還可以看看 在c 11之前,只能對結構體或類的靜態常量成員進行就地初始化,其他的不行。class c class c 或int b c 11 only int c 7 error 1.2就地初始化與初始化列表的先後順序 c 11標準支援了就地初始化非靜態資料成員的同時,初始化列表的方式也被保留下來,...
C 11之列表初始化
c 98使用 對陣列初始化 int arr int arr 4 但對於自定義型別會報錯 vectorv 內建型別 int x1 int x2 int x3 1 2 int x4 int x5 陣列 int arr1 5 int arr2 動態陣列 c 98不支援 int arr3 new int 5...
c 11 統一的初始化和初始化列表
在c 11以前,程式設計師,或者初學者經常會感到疑惑關於怎樣去初始化乙個變數或者是乙個物件。初始化經常使用括號,或者是使用大括號,或者是復賦值操作。因為這個原因,c 11提出了統一初始化,以為著使用這初始化列表,下面的做法都是正確的。int value std vectorvi std vector...