簡(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開始,對(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)”問題方法示例
百馬百擔(dān)是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)單鏈表接口函數(shù)全面講解教程
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)單鏈表所有接口函數(shù)的全面講解教程,有需要朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-10-10
C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
C++數(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-01
Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例
去水印是個(gè)麻煩事,本文就來(lái)介紹一種方法Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
快速解決boost庫(kù)鏈接出錯(cuò)的問題(分享)
下面小編就為大家?guī)?lái)一篇快速解決boost庫(kù)鏈接出錯(cuò)的問題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05

