初始化列表

轉(zhuǎn)載:https://blog.csdn.net/lws123253/article/details/80368047


定義

與其他函數(shù)不同皇耗,構(gòu)造函數(shù)除了有名字棚点,參數(shù)列表和函數(shù)體之外装哆,還可以有初始化列表朱庆,初始化列表以冒號(hào)開(kāi)頭相恃,后跟一系列以逗號(hào)分隔的初始化字段钝满。

class foo
{
public:
foo(string s, int i):name(s), id(i){} ; // 初始化列表
private:
string name ;int id ;
};

從概念上來(lái)講畦木,構(gòu)造函數(shù)的執(zhí)行可以分成兩個(gè)階段袖扛,初始化階段和計(jì)算階段,初始化階段先于計(jì)算階段.

初始化階段

所有類(lèi)類(lèi)型(class type)的成員都會(huì)在初始化階段初始化十籍,即使該成員沒(méi)有出現(xiàn)在構(gòu)造函數(shù)的初始化列表中.

計(jì)算階段

一般用于執(zhí)行構(gòu)造函數(shù)體內(nèi)的賦值操作蛆封。

下面的代碼中,其中Test1有構(gòu)造函數(shù)勾栗,拷貝構(gòu)造函數(shù)及賦值運(yùn)算符惨篱,為的是方便查看結(jié)果,Test2是個(gè)測(cè)試類(lèi)围俘,它以Test1的對(duì)象為成員砸讳,我們看一下Test2的構(gòu)造函數(shù)是怎么樣執(zhí)行的。

class Test1
{
public:
Test1() // 無(wú)參構(gòu)造函數(shù)
{cout << "Construct Test1" << endl ;}
Test1(const Test1& t1) // 拷貝構(gòu)造函數(shù)
{cout << "Copy constructor for Test1" << endl ;this->a = t1.a ;}
Test1& operator = (const Test1& t1) // 賦值運(yùn)算符
{cout << "assignment for Test1" << endl ;this->a = t1.a ;return *this;}
int a ;
};
class Test2
{
public:
Test1 test1 ;
Test2(Test1 &t1)
{test1 = t1 ;}
};

調(diào)用代碼:
Test1 t1 ;
Test2 t2(t1) ;
輸出:
Construct Test1
Construct Test1
assignment for Test1

解釋一下:

第一行輸出對(duì)應(yīng)調(diào)用代碼中第一行界牡,構(gòu)造一個(gè)Test1對(duì)象
第二行輸出對(duì)應(yīng)Test2構(gòu)造函數(shù)中的代碼簿寂,用默認(rèn)的構(gòu)造函數(shù)初始化對(duì)象test1 // 這就是所謂的初始化階段
第三行輸出對(duì)應(yīng)Test2的賦值運(yùn)算符,對(duì)test1執(zhí)行賦值操作 // 這就是所謂的計(jì)算階段

使用初始化列表的原因

初始化類(lèi)的成員有兩種方式:

1 是使用初始化列表宿亡,
2 是在構(gòu)造函數(shù)體內(nèi)進(jìn)行賦值操作常遂。

主要是性能問(wèn)題,對(duì)于內(nèi)置類(lèi)型挽荠,如int, float等烈钞,使用初始化類(lèi)表和在構(gòu)造函數(shù)體內(nèi)初始化差別不是很大,但是對(duì)于類(lèi)類(lèi)型來(lái)說(shuō)坤按,最好使用初始化列表毯欣,為什么呢?由下面的測(cè)試可知臭脓,使用初始化列表少了一次調(diào)用默認(rèn)構(gòu)造函數(shù)的過(guò)程酗钞,這對(duì)于數(shù)據(jù)密集型的類(lèi)來(lái)說(shuō),是非常高效的。同樣看上面的例子砚作,我們使用初始化列表來(lái)實(shí)現(xiàn)Test2的構(gòu)造函數(shù)窘奏。

class Test2
{
public:
Test1 test1 ;
Test2(Test1 &t1):test1(t1){}
}

使用同樣的調(diào)用代碼,輸出結(jié)果如下:
Construct Test1
Copy constructor for Test1
第一行輸出對(duì)應(yīng) 調(diào)用代碼的第一行
第二行輸出對(duì)應(yīng)Test2的初始化列表葫录,直接調(diào)用拷貝構(gòu)造函數(shù)初始化test1着裹,省去了調(diào)用默認(rèn)構(gòu)造函數(shù)的過(guò)程。
所以一個(gè)好的原則是米同,能使用初始化列表的時(shí)候盡量使用初始化列表.
必須使用初始化列表的時(shí)候
除了性能問(wèn)題之外骇扇,有些時(shí)候合初始化列表是不可或缺的.
以下幾種情況時(shí)必須使用初始化列表:

1.常量成員,因?yàn)槌A恐荒艹跏蓟荒苜x值面粮,所以必須放在初始化列表里面
2.引用類(lèi)型少孝,引用必須在定義的時(shí)候初始化,并且不能重新賦值熬苍,所以也要寫(xiě)在初始化列表里面
3.沒(méi)有默認(rèn)構(gòu)造函數(shù)的類(lèi)類(lèi)型稍走,因?yàn)槭褂贸跏蓟斜砜梢圆槐卣{(diào)用默認(rèn)構(gòu)造函數(shù)來(lái)初始化,而是直接調(diào)用拷貝構(gòu)造函數(shù)初始化

class Test1
{
public:
Test1(int a):i(a){}
int i;
};
class Test2
{
public:
Test1 test1 ;
Test2(Test1 &t1)
{test1 = t1 ;}
};

以上代碼無(wú)法通過(guò)編譯柴底,因?yàn)門(mén)est2的構(gòu)造函數(shù)中test1 = t1這一行實(shí)際上分成兩步執(zhí)行:

  1. 調(diào)用Test1的默認(rèn)構(gòu)造函數(shù)來(lái)初始化test1
    由于Test1沒(méi)有默認(rèn)的構(gòu)造函數(shù)婿脸,所以1 無(wú)法執(zhí)行,故而編譯錯(cuò)誤柄驻。正確的代碼如下盖淡,使用初始化列表代替賦值操作
class Test2
{
public:
Test1 test1 ;
Test2(int x):test1(x){}
}

成員變量的順序

成員是按照他們?cè)陬?lèi)中出現(xiàn)的順序進(jìn)行初始化的,而不是按照他們?cè)诔跏蓟斜沓霈F(xiàn)的順序初始化的凿歼,看代碼:

class foo
{
public:
int i ;int j ;
foo(int x):i(x), j(i){}; // ok, 先初始化i褪迟,后初始化j
};

再看下面的代碼:

class foo
{
public:
int i ;int j ;
foo(int x):j(x), i(j){} // i值未定義
};

這里i的值是未定義的因?yàn)殡m然j在初始化列表里面出現(xiàn)在i前面,但是i先于j定義答憔,所以先初始化i味赃,而i由j初始化,此時(shí)j尚未初始化虐拓,所以導(dǎo)致i的值未定義心俗。一個(gè)好的習(xí)慣是,按照成員定義的順序進(jìn)行初始化蓉驹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末城榛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子态兴,更是在濱河造成了極大的恐慌狠持,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞻润,死亡現(xiàn)場(chǎng)離奇詭異喘垂,居然都是意外死亡甜刻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)正勒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)得院,“玉大人,你說(shuō)我怎么就攤上這事章贞∠榻剩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵鸭限,是天一觀的道長(zhǎng)蜕径。 經(jīng)常有香客問(wèn)我,道長(zhǎng)里覆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任缆瓣,我火速辦了婚禮喧枷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弓坞。我一直安慰自己隧甚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布渡冻。 她就那樣靜靜地躺著戚扳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪族吻。 梳的紋絲不亂的頭發(fā)上帽借,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音超歌,去河邊找鬼砍艾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛巍举,可吹牛的內(nèi)容都是我干的脆荷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼懊悯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜓谋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起炭分,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤桃焕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后捧毛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體覆旭,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡退子,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了型将。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寂祥。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖七兜,靈堂內(nèi)的尸體忽然破棺而出丸凭,到底是詐尸還是另有隱情,我是刑警寧澤腕铸,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布惜犀,位于F島的核電站,受9級(jí)特大地震影響狠裹,放射性物質(zhì)發(fā)生泄漏虽界。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一涛菠、第九天 我趴在偏房一處隱蔽的房頂上張望莉御。 院中可真熱鬧,春花似錦俗冻、人聲如沸礁叔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)琅关。三九已至,卻和暖如春讥蔽,著一層夾襖步出監(jiān)牢的瞬間涣易,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工冶伞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留都毒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓碰缔,卻偏偏與公主長(zhǎng)得像账劲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子金抡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本文主要說(shuō)明成員初始化列表的注意事項(xiàng)瀑焦。 I、上帝視角看初始化列表 構(gòu)造函數(shù)可以有兩種構(gòu)造形式梗肝,一是在構(gòu)造函數(shù)體內(nèi)對(duì)...
    wenmingxing閱讀 1,040評(píng)論 0 2
  • 引言 用c++的人都知道榛瓮,c++的構(gòu)造函數(shù)具有初始化列表,初始化列表有什么作用巫击?什么情況下必須使用初始化列表...
    三分鐘熱度的陳恤猿閱讀 951評(píng)論 0 1
  • 初始化列表 在以前禀晓,初始化成員變量是通過(guò)這種方式來(lái)進(jìn)行的 通過(guò)定義一個(gè)構(gòu)造函數(shù)精续,然后再創(chuàng)建對(duì)象時(shí),調(diào)用對(duì)應(yīng)的構(gòu)造函...
    ducktobey閱讀 134評(píng)論 0 0
  • 作者:清雅 燈下坐粹懒,對(duì)愁顏重付。昏昏度日百慮牽凫乖。 匆匆歲月飄如夢(mèng)确垫,恐負(fù)初衷又一年。
    清雅怡然閱讀 274評(píng)論 0 1
  • huang小嫻閱讀 85評(píng)論 0 0