C++ 初始化列表

1.定義

構(gòu)造函數(shù)除了有名字里初,參數(shù)列表和函數(shù)體之外掂铐,還可以有初始化列表芒澜,初始化列表以冒號(hào)開頭,后跟一系列以逗號(hào)分隔的初始化字段

class foo
{
public:
    foo(string s, int i) :name(s), id(i) {}; // 初始化列表
private:
    string name; int id;
};
#include<iostream>
using namespace std;
class Test1
{
public:
    Test1() // 無參構(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;
    }
};
int main()
{
    Test1 t1;
    //Test1 t2(t1);
    Test2 t2(t1);

}
#輸出結(jié)果
1.0
Construct Test1            
Construct Test1
assignment for Test1
2.0
Construct Test1
Copy constructor for Test1
結(jié)果分析

第一行輸出對(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ì)算階段

2.為何使用初始化列表

  • 對(duì)一般的內(nèi)置類型來說,使用初始化類的成員有兩種方式笋籽,一是使用初始化列表蹦漠,二是在構(gòu)造函數(shù)體內(nèi)進(jìn)行賦值操作。
  • 主要是性能問題干签,對(duì)于內(nèi)置類型津辩,如int, float等,使用初始化類表和在構(gòu)造函數(shù)體內(nèi)初始化差別不是很大
  • 但是對(duì)于類類型來說容劳,最好使用初始化列表。由下面的測(cè)試可知闸度,使用初始化列表少了一次調(diào)用默認(rèn)構(gòu)造函數(shù)的過程竭贩,這對(duì)于數(shù)據(jù)密集型的類來說,是非常高效的莺禁。同樣看上面的例子留量,我們使用初始化列表來實(shí)現(xiàn)Test2的構(gòu)造函數(shù)

使用初始化列表實(shí)現(xiàn)的構(gòu)造函數(shù)

第一行輸出對(duì)應(yīng)調(diào)用代碼的第一行。
第二行輸出對(duì)應(yīng)Test2的初始化列表哟冬,直接調(diào)用拷貝構(gòu)造函數(shù)初始化test1楼熄,省去了調(diào)用默認(rèn)構(gòu)造函數(shù)的過程。
所以一個(gè)好的原則是浩峡,能使用初始化列表的時(shí)候盡量使用初始化列表

3.什么情況下必須調(diào)用初始化列表

1.常量成員可岂,因?yàn)槌A恐荒艹跏蓟荒苜x值,所以必須放在初始化列表里面
2.引用類型翰灾,引用必須在定義的時(shí)候初始化缕粹,并且不能重新賦值,所以也要寫在初始化列表里面
3.沒有默認(rèn)構(gòu)造函數(shù)的類類型纸淮,因?yàn)槭褂贸跏蓟斜砜梢圆槐卣{(diào)用默認(rèn)構(gòu)造函數(shù)來初始化平斩,而是直接調(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 ;} //會(huì)出錯(cuò), 調(diào)用Test1的默認(rèn)構(gòu)造函數(shù)來初始化test1咽块,由于Test1沒有默認(rèn)的構(gòu)造函數(shù)
};
Test2(int x):test1(x){}
?著作權(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)離奇詭異塘辅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)皆撩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門扣墩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哲银,“玉大人,你說我怎么就攤上這事呻惕【T穑” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵亚脆,是天一觀的道長(zhǎng)做院。 經(jīng)常有香客問我,道長(zhǎng)濒持,這世上最難降的妖魔是什么键耕? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮柑营,結(jié)果婚禮上屈雄,老公的妹妹穿的比我還像新娘。我一直安慰自己官套,他們只是感情好酒奶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奶赔,像睡著了一般惋嚎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上站刑,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天另伍,我揣著相機(jī)與錄音,去河邊找鬼笛钝。 笑死质况,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玻靡。 我是一名探鬼主播结榄,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼囤捻!你這毒婦竟也來了臼朗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤蝎土,失蹤者是張志新(化名)和其女友劉穎视哑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(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
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奴紧。 院中可真熱鬧特姐,春花似錦、人聲如沸黍氮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沫浆。三九已至,卻和暖如春滚秩,著一層夾襖步出監(jiān)牢的瞬間专执,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工郁油, 沒想到剛下飛機(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)容

  • 本文主要說明成員初始化列表的注意事項(xiàng)躬审。 I、上帝視角看初始化列表 構(gòu)造函數(shù)可以有兩種構(gòu)造形式蟆盐,一是在構(gòu)造函數(shù)體內(nèi)對(duì)...
    wenmingxing閱讀 1,040評(píng)論 0 2
  • C++的初始化列表和列表初始化 初始化列表 初始化列表是聲明在構(gòu)造函數(shù)中來實(shí)現(xiàn)的承边,相當(dāng)于初始化,而不是復(fù)制操作 初...
    突擊手平頭哥閱讀 5,076評(píng)論 0 0
  • 引言 用c++的人都知道石挂,c++的構(gòu)造函數(shù)具有初始化列表博助,初始化列表有什么作用?什么情況下必須使用初始化列表...
    三分鐘熱度的陳恤猿閱讀 951評(píng)論 0 1
  • 初始化列表 特點(diǎn) 一種便捷的初始化成員變量的方式 只能在構(gòu)造函數(shù)中 初始化列表與默認(rèn)參數(shù)配合使用 如果函數(shù)的聲明和...
    lieon閱讀 387評(píng)論 0 1
  • 轉(zhuǎn)載:https://blog.csdn.net/lws123253/article/details/803680...
    o言笑晏晏o閱讀 142評(píng)論 0 0