c++11之前主要有以下幾種初始化方式:
//小括號初始化
string str("hello");
//等號初始化
string str="hello";
//pod物件與pod陣列列表初始化
struct studnet
;studnet s=; //純資料(plain of data,pod)型別物件
studnet sarr=,}; //pod陣列
//建構函式的初始化列表
class class
};
在c++11以前,程式設計師,或者初學者經常會感到疑惑關於怎樣去初始化乙個變數或者是乙個物件。這麼多的物件初始化方式,不僅增加了學習成本,也使得**風格有較大出入,影響了**的可讀性和統一性。
從c++11開始,對列表初始化(list initialization)的功能進行了擴充,可以作用於任何型別物件的初始化,至此,列表初始化方式完成了天下大一統。
花括號列表初始化,作為c++11新標準的一部被加入到了c++中。
因為這個原因,c++11提出了統一初始化,以為著使用這初始化列表,下面的做法都是正確的。
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提供的列表初始化作為統一的初始化方式,既降低了記憶難度,也提高的**的統一度。
此外,c++11中,類的資料成員在申明時可以直接賦予乙個預設值:
class c
;
所謂花括號列表初始化,即是用花括號來初始化變數,其形式如: int test = ;無論是初始化物件還是為物件賦值 , 在c++11下都可以使用這種形式的初始值。
不同的一點 是:使用這種形式來初始化內建型別的變數時,若存在型別轉換且具有丟失資訊的風險時,編譯器將會報錯。
通過這一點可以看出,列表初始化比原有的初始化方式具有更嚴格的安全要求。下面是例子:
long double ld = 3.1415926536;
int a , b = // 編譯器報錯,存在丟失資訊的風險
int c (ld) , d = ld ; //正確
C 11新標準學習之花括號初始化列表
花括號列表初始化,作為c 11新標準的一部被加入到了c 中。所謂花括號列表初始化,即是用花括號來初始化變數,其形式如 int test 無論是初始化物件還是為物件賦值 在c 11下都可以使用這種形式的初始值。不同的一點 是 使用這種形式來初始化內建型別的變數時,若存在型別轉換且具有丟失資訊的風險時,...
C 11 列表初始化及類內初始化
c 11中,集合 列表 的初始化已經成為c 語言的乙個基本功能,這種初始化的方法被稱為 初始化列表 initializer list 例如 include include using namespace std int a int b vector int c map int,float d 這樣一...
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...