簡述C++11就地初始化與列表初始化
1.就地初始化
1.1簡介
在C++11之前,只能對結(jié)構(gòu)體或類的靜態(tài)常量成員進行就地初始化,其他的不行。
class C { private: static const int a=10; //yes int a=10; //no }
在C++11中,結(jié)構(gòu)體或類的數(shù)據(jù)成員在申明時可以直接賦予一個默認值,初始化的方式有兩種,一是使用等號“=”,二是使用大括號列表初始化的方式。注意,使用參考如下代碼:
class C { private: int a=7; //C++11 only int b{7}; //或int b={7}; C++11 only int c(7); //error };
注意,小括號初始化方式不能應(yīng)用于就地初始化。
1.2就地初始化與初始化列表的先后順序
C++11標(biāo)準支持了就地初始化非靜態(tài)數(shù)據(jù)成員的同時,初始化列表的方式也被保留下來,也就是說既可以使用就地初始化,也可以使用初始化列表來完成數(shù)據(jù)成員的初始化工作。當(dāng)二者同時使用時,并不沖突,初始化列表發(fā)生在就地初始化之后,即最終的初始化結(jié)果以初始化列表為準。參考如下代碼:
#include <iostream> using namespace std; class Mem { public: Mem(int i,int j):m1(i),m2(j) {} int m1 = 1; int m2 = {2}; }; int main() { Mem mem(11,22); cout<<"m1="<< mem.m1<<" m2="<<mem.m2<<endl; }
程序輸出結(jié)果:
m1=11 m2=22
2.列表初始化
C++11之前主要有以下幾種初始化方式:
//小括號初始化 string str("hello"); //等號初始化 string str="hello"; //POD對象與POD數(shù)組列表初始化 struct Studnet { char* name; int age; }; Studnet s={"dablelv",18}; //純數(shù)據(jù)(Plain of Data,POD)類型對象 Studnet sArr[]={{"dablelv",18},{"tommy",19}}; //POD數(shù)組 //構(gòu)造函數(shù)的初始化列表 class Class { int x; public: Class():x(0){} };
這么多的對象初始化方式,不僅增加了學(xué)習(xí)成本,也使得代碼風(fēng)格有較大出入,影響了代碼的可讀性和統(tǒng)一性。從C++11開始,對列表初始化(List Initialization)的功能進行了擴充,可以作用于任何類型對象的初始化,至此,列表初始化方式完成了天下大一統(tǒng)。
class Test { int a; int b; public: C(int i, int j); }; Test t{0,0}; //C++11 only,相當(dāng)于 Test t(0,0); Test* pT=new Test{1,2}; //C++11 only,相當(dāng)于 Test* pT=new Test{1,2}; int* a = new int[3]{1,2,0}; //C++11 only
此外,C++11列表初始化還可以應(yīng)用于容器,終于可以擺脫 push_back() 調(diào)用了,C++11中可以直觀地初始化容器:
//C++11 container initializer vector<string> vs={"first", "second", "third"}; map<string,string> singers ={{"Lady Gaga", "+1 (212) 555-7890"},{"Beyonce Knowles", "+1 (212) 555-0987"}};
因此,可以將C++11提供的列表初始化作為統(tǒng)一的初始化方式,既降低了記憶難度,也提高的代碼的統(tǒng)一度。
以上就是簡述C++11就地初始化與列表初始化的詳細內(nèi)容,更多關(guān)于C++11就地初始化與列表初始化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用C語言實現(xiàn)“百馬百擔(dān)”問題方法示例
百馬百擔(dān)是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語言實現(xiàn)“百馬百擔(dān)”問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12C語言數(shù)據(jù)結(jié)構(gòu)單鏈表接口函數(shù)全面講解教程
這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)單鏈表所有接口函數(shù)的全面講解教程,有需要朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2021-10-10C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)循環(huán)順序隊列
這篇文章主要介紹了 C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)循環(huán)順序隊列的相關(guān)資料,需要的朋友可以參考下2017-01-01