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

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ù)測(cè)的值。這個(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>
            99re这里只有精品6| 国产精品中文字幕欧美| 午夜精品一区二区三区在线播放 | 可以看av的网站久久看| 亚洲少妇在线| 91久久精品日日躁夜夜躁国产| 午夜精品福利电影| 日韩视频免费看| 在线日韩av| 国产精品专区第二| 欧美日韩免费在线| 久久一区二区精品| 先锋a资源在线看亚洲| 99精品免费视频| 亚洲国产精品嫩草影院| 欧美99久久| 久久精品一二三| 香蕉国产精品偷在线观看不卡| 日韩一级精品视频在线观看| 影音先锋中文字幕一区| 国产日韩一区欧美| 国产精品日韩在线观看| 欧美四级在线观看| 欧美激情中文字幕一区二区| 久久这里只有精品视频首页| 久久se精品一区精品二区| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲精品一区二区网址| 欧美二区在线播放| 久久综合久久综合这里只有精品| 香蕉av福利精品导航| 亚洲天堂网站在线观看视频| 国产精品99久久久久久宅男| 99精品国产99久久久久久福利| 91久久综合| 亚洲国产第一| 亚洲二区在线视频| 亚洲国产综合视频在线观看| 亚洲第一在线综合网站| 亚洲第一页中文字幕| 亚洲高清不卡在线| 亚洲国产精品久久| 亚洲人成在线观看网站高清| 亚洲精品黄网在线观看| 日韩午夜黄色| 一区二区三区四区五区在线| 亚洲影视九九影院在线观看| 亚洲尤物影院| 欧美在线首页| 久久综合久久美利坚合众国| 欧美大片在线看| 亚洲黄色视屏| 99视频精品在线| 亚洲综合国产精品| 欧美在线观看网址综合| 久久久亚洲国产天美传媒修理工| 久久在线91| 欧美日韩国产综合一区二区| 国产精品久久久久久久久久三级| 国产亚洲精品久| 亚洲成色777777在线观看影院| 亚洲经典自拍| 亚洲视频图片小说| 欧美在线观看视频在线| 另类av导航| 亚洲人久久久| 午夜精品国产| 免费久久精品视频| 国产精品初高中精品久久| 国产一区成人| 亚洲精品视频一区| 亚洲欧美电影在线观看| 麻豆精品在线观看| 亚洲精品国偷自产在线99热| 亚洲欧美日韩精品久久奇米色影视| 久久xxxx精品视频| 欧美日韩国产三区| 国产视频精品xxxx| 亚洲精品国产拍免费91在线| 欧美有码在线观看视频| 欧美激情1区2区3区| 在线天堂一区av电影| 久久蜜桃香蕉精品一区二区三区| 欧美日韩高清区| 国内精品伊人久久久久av影院| 99re6这里只有精品| 久久久噜噜噜久噜久久 | 日韩视频一区二区三区在线播放| 亚洲欧美久久久| 欧美成人精品h版在线观看| 一本色道久久综合亚洲精品按摩| 久久久www成人免费无遮挡大片| 欧美日韩黄色大片| 一区二区三区自拍| 性久久久久久久久久久久| 欧美激情亚洲一区| 欧美在线首页| 国产精品高潮久久| 日韩视频在线一区二区三区| 久久久国产成人精品| 日韩一区二区久久| 久热re这里精品视频在线6| 国产欧美精品一区aⅴ影院| 99亚洲伊人久久精品影院红桃| 久久亚洲国产精品一区二区 | 亚洲美女视频在线观看| 久久成人免费电影| 一区二区欧美日韩| 欧美高清在线视频观看不卡| 激情六月婷婷久久| 欧美一区二区女人| 一本大道久久a久久精品综合| 免费在线亚洲欧美| 在线播放一区| 久久亚洲一区二区| 亚洲欧美在线看| 欧美色欧美亚洲高清在线视频| 亚洲日本va午夜在线电影| 久久亚洲午夜电影| 欧美一区二区视频在线观看| 国产精品家庭影院| 亚洲一区免费| 在线综合亚洲| 欧美性大战久久久久| 亚洲婷婷综合色高清在线| 亚洲国产精品久久久久秋霞不卡| 久久久久久亚洲精品不卡4k岛国| 国产亚洲福利| 欧美在线视频a| 亚洲欧美成人| 国产午夜精品视频免费不卡69堂| 欧美亚洲专区| 亚洲欧美一区二区原创| 国产精品入口尤物| 午夜精品999| 亚洲欧美日韩人成在线播放| 国产精品视频一| 欧美在线免费视屏| 欧美亚洲免费电影| 国产精品亚洲综合一区在线观看 | 狂野欧美激情性xxxx欧美| 欧美一区二区| 精品二区久久| 欧美夫妇交换俱乐部在线观看| 老鸭窝91久久精品色噜噜导演| 亚洲黄一区二区三区| 亚洲国产二区| 欧美日韩国产综合视频在线观看中文 | 亚洲精品免费在线| 亚洲欧洲一区二区三区在线观看| 欧美精品性视频| 亚洲香蕉视频| 亚洲欧洲av一区二区| 国内精品免费午夜毛片| 理论片一区二区在线| 欧美激情亚洲| 亚洲欧美日韩一区在线| 先锋影音国产一区| 在线观看精品| 亚洲精品国产精品国自产观看浪潮| 欧美日韩一级大片网址| 欧美在线free| 老巨人导航500精品| 中国成人黄色视屏| 午夜视频一区在线观看| 在线观看中文字幕不卡| 亚洲欧洲视频在线| 国产美女诱惑一区二区| 免费永久网站黄欧美| 欧美母乳在线| 久久激情视频免费观看| 老司机一区二区三区| 亚洲影音一区| 久久国产精品99久久久久久老狼| 亚洲欧洲另类国产综合| 亚洲视频免费在线| 红桃视频国产一区| 99国产精品视频免费观看一公开| 国产亚洲一区精品| 91久久综合亚洲鲁鲁五月天| 国产精品一区一区三区| 欧美高清不卡| 国产精自产拍久久久久久| 免费成人黄色片| 国产精品高清网站| 免费亚洲电影在线| 国产精品久久久久aaaa| 欧美成人精品一区二区| 国产精品成人国产乱一区| 美女免费视频一区| 国产精品久久久久久久久搜平片| 蜜臀久久99精品久久久久久9 | 久久综合色88| 欧美一区在线直播| 欧美精品久久久久久久| 久久躁狠狠躁夜夜爽| 国产精品99免费看| 亚洲福利视频一区二区| 国产一区二区中文| 一区二区三区欧美在线|