簡(jiǎn)述C++11就地初始化與列表初始化
1.就地初始化
1.1簡(jiǎn)介
在C++11之前,只能對(duì)結(jié)構(gòu)體或類的靜態(tài)常量成員進(jìn)行就地初始化,其他的不行。
class C { private: static const int a=10; //yes int a=10; //no }
在C++11中,結(jié)構(gòu)體或類的數(shù)據(jù)成員在申明時(shí)可以直接賦予一個(gè)默認(rèn)值,初始化的方式有兩種,一是使用等號(hào)“=”,二是使用大括號(hào)列表初始化的方式。注意,使用參考如下代碼:
class C { private: int a=7; //C++11 only int b{7}; //或int b={7}; C++11 only int c(7); //error };
注意,小括號(hào)初始化方式不能應(yīng)用于就地初始化。
1.2就地初始化與初始化列表的先后順序
C++11標(biāo)準(zhǔn)支持了就地初始化非靜態(tài)數(shù)據(jù)成員的同時(shí),初始化列表的方式也被保留下來(lái),也就是說(shuō)既可以使用就地初始化,也可以使用初始化列表來(lái)完成數(shù)據(jù)成員的初始化工作。當(dāng)二者同時(shí)使用時(shí),并不沖突,初始化列表發(fā)生在就地初始化之后,即最終的初始化結(jié)果以初始化列表為準(zhǔn)。參考如下代碼:
#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之前主要有以下幾種初始化方式:
//小括號(hào)初始化 string str("hello"); //等號(hào)初始化 string str="hello"; //POD對(duì)象與POD數(shù)組列表初始化 struct Studnet { char* name; int age; }; Studnet s={"dablelv",18}; //純數(shù)據(jù)(Plain of Data,POD)類型對(duì)象 Studnet sArr[]={{"dablelv",18},{"tommy",19}}; //POD數(shù)組 //構(gòu)造函數(shù)的初始化列表 class Class { int x; public: Class():x(0){} };
這么多的對(duì)象初始化方式,不僅增加了學(xué)習(xí)成本,也使得代碼風(fēng)格有較大出入,影響了代碼的可讀性和統(tǒng)一性。從C++11開(kāi)始,對(duì)列表初始化(List Initialization)的功能進(jìn)行了擴(kuò)充,可以作用于任何類型對(duì)象的初始化,至此,列表初始化方式完成了天下大一統(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)一度。
以上就是簡(jiǎn)述C++11就地初始化與列表初始化的詳細(xì)內(nèi)容,更多關(guān)于C++11就地初始化與列表初始化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法示例
百馬百擔(dān)是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)單鏈表接口函數(shù)全面講解教程
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)單鏈表所有接口函數(shù)的全面講解教程,有需要朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-10-10C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11C++數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)循環(huán)順序隊(duì)列
這篇文章主要介紹了 C++數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)循環(huán)順序隊(duì)列的相關(guān)資料,需要的朋友可以參考下2017-01-01Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例
去水印是個(gè)麻煩事,本文就來(lái)介紹一種方法Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09快速解決boost庫(kù)鏈接出錯(cuò)的問(wèn)題(分享)
下面小編就為大家?guī)?lái)一篇快速解決boost庫(kù)鏈接出錯(cuò)的問(wèn)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05