青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

C++ 類成員初始化的兩種方法

Posted on 2009-09-07 18:19 S.l.e!ep.¢% 閱讀(568) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++
在使用C++編程的過程當(dāng)中,常常需要對(duì)類成員進(jìn)行初始化,通常的方法有兩種:

第一種方法:

CMYClass::CSomeClass()
{
????x=0;
????y=1;
}

第二種方法:

CSomeClass::CSomeClass()?:?x(0),?y(1)
{
}

本文將要探討這兩種方法的異同以及如何使用這兩種方法。

????從技術(shù)上說,第二種方法比較好,但是在大多數(shù)情況下,兩者實(shí)際上沒有什么區(qū)別。第二種語法被稱為成員初始化列表,之所以要使用這種語法有兩個(gè)原因:一個(gè)原因是必須這么做,另一個(gè)原因是出于效率考慮。
????讓我們先看一下第一個(gè)原因——必要性。設(shè)想你有一個(gè)類成員,它本身是一個(gè)類或者結(jié)構(gòu),而且只有一個(gè)帶一個(gè)參數(shù)的構(gòu)造函數(shù)。

class?CMember?{
public:
????CMember(int?x)?{?...?}
};

????因?yàn)镃Member有一個(gè)顯式聲明的構(gòu)造函數(shù),編譯器不產(chǎn)生一個(gè)缺省構(gòu)造函數(shù)(不帶參數(shù)),所以沒有一個(gè)整數(shù)就無法創(chuàng)建CMember的一個(gè)實(shí)例。

CMember*?pm?=?new?CMember;????????//?出錯(cuò)!!
CMember*?pm?=?new?CMember(2);?????//?OK

????如果CMember是另一個(gè)類的成員,你怎樣初始化它呢?答案是你必須使用成員初始化列表。

class?CMyClass?{
????CMember?m_member;
public:
????CMyClass();
};
//?必須使用初始化列表來初始化成員?m_member
CMyClass::CMyClass()?:?m_member(2)

{
"""
}

????沒有其它辦法將參數(shù)傳遞給m_member,如果成員是一個(gè)常量對(duì)象或者引用也是一樣。根據(jù)C++的規(guī)則,常量對(duì)象和引用不能被賦值,它們只能被初始化。

????使用初始化列表的第二個(gè)原因是出于效率考慮,當(dāng)成員類具有一個(gè)缺省的構(gòu)造函數(shù)和一個(gè)賦值操作符時(shí)。MFC的CString提供了一個(gè)完美的例子。假定你有一個(gè)類CMyClass具有一個(gè)CString類型的成員m_str,你想把它初始化為"Hi,how?are?you."。你有兩種選擇:

CMyClass::CMyClass()?{
//?使用賦值操作符
//?CString::operator=(LPCTSTR);
m_str?=?_T("Hi,how?are?you.");
}

//?使用初始化列表
//?和構(gòu)造函數(shù)?CString::CString(LPCTSTR)
CMyClass::CMyClass()?:?m_str(_T("Hi,how?are?you."))
{
}

????在它們之間有什么不同嗎?是的。編譯器總是確保所有成員對(duì)象在構(gòu)造函數(shù)體執(zhí)行之前被初始化,因此在第一個(gè)例子中編譯的代碼將調(diào)用CString::Cstring來初始化m_str,這在控制到達(dá)賦值語句前完成。在第二個(gè)例子中編譯器產(chǎn)生一個(gè)對(duì)CString::?CString(LPCTSTR)的調(diào)用并將"Hi,how?are?you."傳遞給這個(gè)函數(shù)。結(jié)果是在第一個(gè)例子中調(diào)用了兩個(gè)CString函數(shù)(構(gòu)造函數(shù)和賦值操作符),而在第二個(gè)例子中只調(diào)用了一個(gè)函數(shù)。

????在CString的例子里這是無所謂的,因?yàn)槿笔?gòu)造函數(shù)是內(nèi)聯(lián)的,CString只是在需要時(shí)為字符串分配內(nèi)存(即,當(dāng)你實(shí)際賦值時(shí))。但是,一般而言,重復(fù)的函數(shù)調(diào)用是浪費(fèi)資源的,尤其是當(dāng)構(gòu)造函數(shù)和賦值操作符分配內(nèi)存的時(shí)候。在一些大的類里面,你可能擁有一個(gè)構(gòu)造函數(shù)和一個(gè)賦值操作符都要調(diào)用同一個(gè)負(fù)責(zé)分配大量內(nèi)存空間的Init函數(shù)。在這種情況下,你必須使用初始化列表,以避免不要的分配兩次內(nèi)存。
????在內(nèi)建類型如ints或者longs或者其它沒有構(gòu)造函數(shù)的類型下,在初始化列表和在構(gòu)造函數(shù)體內(nèi)賦值這兩種方法沒有性能上的差別。不管用那一種方法,都只會(huì)有一次賦值發(fā)生。有些程序員說你應(yīng)該總是用初始化列表以保持良好習(xí)慣,但我從沒有發(fā)現(xiàn)根據(jù)需要在這兩種方法之間轉(zhuǎn)換有什么困難。在編程風(fēng)格上,我傾向于在主體中使用賦值,因?yàn)橛懈嗟目臻g用來格式化和添加注釋,你可以寫出這樣的語句:

x=y=z=0;

或者

memset(this,0,sizeof(this));

注意第二個(gè)片斷絕對(duì)是非面向?qū)ο蟮摹?

????當(dāng)我考慮初始化列表的問題時(shí),有一個(gè)奇怪的特性我應(yīng)該警告你,它是關(guān)于C++初始化類成員的,它們是按照聲明的順序初始化的,而不是按照出現(xiàn)在初始化列表中的順序。

class?CMyClass?{
????CMyClass(int?x,?int?y);
????int?m_x;
????int?m_y;
};
CMyClass::CMyClass(int?i)?:?m_y(i),?m_x(m_y)
{
}

????你可能以為上面的代碼將會(huì)首先做m_y=i,然后做m_x=m_y,最后它們有相同的值。但是編譯器先初始化m_x,然后是m_y,,因?yàn)樗鼈兪前催@樣的順序聲明的。結(jié)果是m_x將有一個(gè)不可預(yù)測的值。這個(gè)例子是故意這樣設(shè)計(jì)來說明這一點(diǎn)的,然而這種bug會(huì)很自然地出現(xiàn)。有兩種方法避免它,一個(gè)是總是按照你希望它們被初始化的順序來聲明成員,第二個(gè)是,如果你決定使用初始化列表,總是按照它們聲明的順序羅列這些成員。這將有助于消除混淆。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美另类中文字幕| 亚洲欧洲视频| 欧美日韩一区二区免费在线观看| 午夜视频一区二区| 亚洲精品日韩综合观看成人91| 久久久久久网址| 亚洲欧美国产日韩天堂区| 亚洲精品女人| 亚洲国产综合视频在线观看| 国产精品亚洲视频| 欧美日韩一区二区高清| 欧美激情一区| 嫩草成人www欧美| 欧美制服丝袜第一页| 亚洲亚洲精品三区日韩精品在线视频| 亚洲高清一区二| 蜜桃伊人久久| 久久亚洲捆绑美女| 久久久999成人| 久久成人资源| 欧美一区综合| 欧美一区二区免费观在线| 亚洲一区二区网站| 亚洲午夜日本在线观看| 亚洲少妇一区| 亚洲天堂激情| 亚洲天堂av电影| 亚洲午夜黄色| 亚洲一区成人| 亚洲——在线| 欧美一级一区| 亚洲欧美日韩精品久久奇米色影视| 一本久道综合久久精品| 亚洲毛片一区二区| av成人免费在线观看| 在线一区二区三区四区| 一区二区欧美在线观看| 亚洲一二三区精品| 亚洲一区二区四区| 欧美一区二区三区四区在线 | 欧美中文在线视频| 欧美一区=区| 欧美专区亚洲专区| 久久男女视频| 欧美激情视频在线免费观看 欧美视频免费一 | 久久精品国产免费观看| 久久久噜噜噜久久人人看| 久久精品免费观看| 美女国内精品自产拍在线播放| 美国十次成人| 欧美日韩国产一区二区三区地区| 欧美日韩精品在线观看| 国产精品久久久久久久久免费| 国产欧美日韩精品丝袜高跟鞋| 国产亚洲激情视频在线| 狠狠久久亚洲欧美| 亚洲精品一区二区三区99| 宅男66日本亚洲欧美视频| 香蕉成人久久| 免费日本视频一区| 亚洲精品久久视频| 亚洲综合成人婷婷小说| 久久久久一区二区| 欧美日韩国产一区精品一区| 国产欧美日韩视频一区二区三区| 狠狠色丁香久久婷婷综合丁香 | 欧美1区2区3区| 欧美视频精品在线观看| 激情视频亚洲| 一区二区国产精品| 久久精品理论片| 亚洲第一二三四五区| 一区二区三欧美| 久久亚洲私人国产精品va| 欧美日韩综合网| 精品va天堂亚洲国产| 亚洲午夜在线视频| 狂野欧美激情性xxxx欧美| 亚洲欧洲精品一区二区三区| 性久久久久久久久| 欧美精品v国产精品v日韩精品| 国产欧美一区二区三区另类精品 | 好吊成人免视频| 99精品免费网| 开心色5月久久精品| 一本一本久久a久久精品牛牛影视| 久久精品日产第一区二区| 欧美日韩另类字幕中文| 激情综合久久| 欧美一区二区精美| 亚洲精品韩国| 久久午夜羞羞影院免费观看| 国产精品国产三级欧美二区| 亚洲国产高清一区二区三区| 欧美一级片久久久久久久| 亚洲人www| 久久久久国产精品一区| 国产精品手机在线| 一本色道久久综合亚洲精品高清| 久久亚洲高清| 亚洲欧美日韩中文播放| 欧美日本韩国一区二区三区| 影院欧美亚洲| 久久成人精品无人区| 一区二区精品| 欧美日本中文| 亚洲精品乱码久久久久| 久久中文字幕一区| 亚洲欧美偷拍卡通变态| 欧美性大战久久久久久久| 亚洲美女黄色片| 欧美高清在线播放| 久久精品天堂| 国产一区二区主播在线| 欧美在线视频网站| 亚洲一区观看| 欧美性事在线| 亚洲一级片在线观看| 日韩亚洲一区在线播放| 欧美精品午夜| 一本大道久久a久久精二百| 亚洲国产欧美不卡在线观看| 久久青草久久| 亚洲国产精品久久久久秋霞影院 | 欧美欧美午夜aⅴ在线观看| 亚洲激情在线视频| 欧美成人蜜桃| 欧美a级一区| 亚洲每日更新| 亚洲美洲欧洲综合国产一区| 欧美日韩人人澡狠狠躁视频| 99国产精品99久久久久久粉嫩| 亚洲国产精品ⅴa在线观看| 美国十次成人| 日韩一级黄色片| 99国内精品| 国产伦理一区| 久久久久久久999| 久久亚洲国产精品一区二区| 亚洲黄色视屏| 日韩视频中文| 国产精品日日摸夜夜添夜夜av| 欧美中文字幕视频在线观看| 久久激情久久| 亚洲国产毛片完整版| 亚洲黄色毛片| 国产精品国内视频| 久久九九免费| 欧美成年人网| 在线一区二区三区做爰视频网站| 一区二区三区蜜桃网| 国产精品自在欧美一区| 久久久精品国产免大香伊| 久久网站免费| 一区二区三区四区五区在线| 亚洲女人天堂成人av在线| 好吊日精品视频| 亚洲国产一成人久久精品| 欧美日韩中文字幕日韩欧美| 欧美一区在线看| 玖玖综合伊人| 亚洲无限乱码一二三四麻| 午夜免费日韩视频| 亚洲韩国精品一区| 一区二区三区四区在线| 国产一区二区三区久久悠悠色av | 中国成人在线视频| 韩国欧美一区| 日韩午夜精品| 黄色一区二区三区| 亚洲精品国产精品国产自| 国产伦精品一区二区三| 欧美激情小视频| 国产精品自拍小视频| 欧美激情免费观看| 国产精品人人做人人爽| 欧美大胆成人| 国产精品欧美风情| 亚洲成人在线视频播放 | 日韩亚洲欧美综合| 狠狠色综合日日| 艳女tv在线观看国产一区| 一区在线免费| 亚洲一区成人| 日韩特黄影片| 久久精品久久99精品久久| 亚洲神马久久| 狼人天天伊人久久| 欧美在线视频一区二区| 欧美日韩国产综合视频在线| 久久综合伊人77777| 国产精品高清免费在线观看| 欧美寡妇偷汉性猛交| 国产手机视频一区二区| 日韩一级网站| 亚洲精品美女免费| 久久精品视频99| 午夜精品久久久久久久99水蜜桃| 欧美福利电影在线观看| 免费成人毛片|