還可以看看:
在c++11之前,只能對結構體或類的靜態常量成員進行就地初始化,其他的不行。
class c
class c
; //或int b=; c++11 only
int c(7); //error
};
1.2就地初始化與初始化列表的先後順序
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;
int* a = new int[3]; //c++11 only
此外,c++11列表初始化還可以應用於容器,終於可以擺脫 push_back() 呼叫了,c++11中可以直觀地初始化容器:
//c++11 container initializer
vectorvs=;
mapsingers =,};
因此,可以將c++11提供的列表初始化作為統一的初始化方式,既降低了記憶難度,也提高的**的統一度。
統一初始化語法
c++11新新增初始化列表 std::initializer_list<>型別,可以通過{}語法來構造初始化列表 。初始化列表是常數;一旦被建立,其成員均不能被改變,成員中的資料也不能夠被變動。函式能夠使用初始化列表作為引數。
在引入c++ 11之前,有各種不同的初始化語法。在c++ 11中,仍可以使用這些初始化語法,但也可以選擇使用新引入的統一的初始化語法。統一的初始化語法用一對大括號{}表示。
std::vectorv1 = ;
std::vectorv2 = ;
// 注: vs2012 不支援統一初始化方式{}
類內成員初始化
#define _crt_secure_no_warnings
#include #include #include #include class mem
int getm()
const int m;
int &n;
};void mytest()
; mem mem; // 物件成員,建立物件時,可以使用{}來呼叫建構函式 // 注: vs2012 不支援統一初始化方式{}
std::string name("xyz"); // 使用()來呼叫建構函式
return;
}int main()
列表初始化
c++11引入了乙個新的初始化方式,稱為初始化列表(list initialize),具體的初始化方式如下:
#define _crt_secure_no_warnings
#include #include #include #include class person
;void mytest()
; int b; // 注: vs2012 不支援
int i = ;
int j; // 注: vs2012 不支援
// 初始化列表可以用於初始化結構體型別
person p1 = ;
std::vectorivec1(3,4);
// 其他一些不方便初始化的地方使用,比如std的初始化,如果不使用這種方式,只能用建構函式來初始化,難以達到效果
std::vectorivec2 = ; // 注: vs2012 不支援
std::vectorivec3 = ; // 注: vs2012 不支援
return;
}int main()
防止型別收窄
型別收窄指的是導致資料內容發生變化或者精度丟失的隱式型別轉換。使用列表初始化可以防止型別收窄。
#define _crt_secure_no_warnings
#include #include #include #include void mytest()
; // err,收窄,無法通過編譯
char d = ; // 可以通過編譯
unsigned char e; // err,收窄,無法通過編譯
float f; // 可以通過編譯
int g; // err,收窄,無法通過編譯
float * h = new float; // err,收窄,無法通過編譯
float i = 1.21; // 可以通過編譯
return;
}int main()
C 11 就地初始化與列表初始化
在 c 11 之前,只能對結構體或類的靜態常量成員進行就地初始化,其他的不行。class c class c or int b c 11 only int c 7 error 注意,小括號初始化方式不能用於就地初始化。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...