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

S.l.e!ep.¢%

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

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

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

第一種方法:

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

第二種方法:

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

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

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

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

????因為CMember有一個顯式聲明的構造函數,編譯器不產生一個缺省構造函數(不帶參數),所以沒有一個整數就無法創建CMember的一個實例。

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

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

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

{
"""
}

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

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

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

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

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

????在CString的例子里這是無所謂的,因為缺省構造函數是內聯的,CString只是在需要時為字符串分配內存(即,當你實際賦值時)。但是,一般而言,重復的函數調用是浪費資源的,尤其是當構造函數和賦值操作符分配內存的時候。在一些大的類里面,你可能擁有一個構造函數和一個賦值操作符都要調用同一個負責分配大量內存空間的Init函數。在這種情況下,你必須使用初始化列表,以避免不要的分配兩次內存。
????在內建類型如ints或者longs或者其它沒有構造函數的類型下,在初始化列表和在構造函數體內賦值這兩種方法沒有性能上的差別。不管用那一種方法,都只會有一次賦值發生。有些程序員說你應該總是用初始化列表以保持良好習慣,但我從沒有發現根據需要在這兩種方法之間轉換有什么困難。在編程風格上,我傾向于在主體中使用賦值,因為有更多的空間用來格式化和添加注釋,你可以寫出這樣的語句:

x=y=z=0;

或者

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

注意第二個片斷絕對是非面向對象的。

????當我考慮初始化列表的問題時,有一個奇怪的特性我應該警告你,它是關于C++初始化類成員的,它們是按照聲明的順序初始化的,而不是按照出現在初始化列表中的順序。

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

????你可能以為上面的代碼將會首先做m_y=i,然后做m_x=m_y,最后它們有相同的值。但是編譯器先初始化m_x,然后是m_y,,因為它們是按這樣的順序聲明的。結果是m_x將有一個不可預測的值。這個例子是故意這樣設計來說明這一點的,然而這種bug會很自然地出現。有兩種方法避免它,一個是總是按照你希望它們被初始化的順序來聲明成員,第二個是,如果你決定使用初始化列表,總是按照它們聲明的順序羅列這些成員。這將有助于消除混淆。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            美女福利精品视频| 国产在线精品二区| 欧美在线观看日本一区| 亚洲欧美久久久久一区二区三区| 亚洲一区国产精品| 欧美伊人久久大香线蕉综合69| 一区二区三区视频在线播放| 欧美在线播放一区| 欧美一站二站| 久久久天天操| 亚洲国产美国国产综合一区二区| 亚洲国产高清aⅴ视频| 99re66热这里只有精品4| 亚洲影视中文字幕| 久久综合伊人| 国产精品高清在线| 在线观看日韩av先锋影音电影院| 一本久道久久综合中文字幕| 久久久久久久久久久久久9999| 亚洲国产第一页| 亚洲欧美一区二区激情| 欧美精品一卡| 黄色国产精品| 亚洲欧美日韩网| 欧美成人有码| 午夜亚洲性色福利视频| 欧美激情一区二区三区在线视频观看| 国产精品福利片| 91久久精品一区二区别| 欧美亚洲综合久久| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲小说欧美另类婷婷| 欧美高清在线精品一区| 国产在线视频欧美| 亚洲自拍偷拍福利| 亚洲国产日韩一级| 久久天堂av综合合色| 国产日韩精品在线观看| 亚洲在线成人精品| 亚洲区第一页| 欧美成人首页| 亚洲国产99精品国自产| 久久婷婷综合激情| 亚洲欧美日韩在线高清直播| 欧美日韩一级视频| 一本大道久久精品懂色aⅴ | 欧美一区二区视频免费观看| 亚洲国产欧美精品| 久久久人成影片一区二区三区 | 美女视频一区免费观看| 国产日韩精品一区二区浪潮av| 正在播放亚洲| 亚洲精品中文字幕在线| 欧美不卡高清| 亚洲精品国产精品国自产观看| 麻豆精品一区二区av白丝在线| 亚洲影院在线| 国产精品视频网| 欧美一区成人| 亚洲欧美日韩精品| 国产精品青草综合久久久久99| 国自产拍偷拍福利精品免费一| 欧美一级视频| 亚洲午夜久久久久久尤物 | 国产视频一区免费看| 欧美一级大片在线观看| 亚洲欧美韩国| 国产精品综合不卡av| 久久久国际精品| 久久噜噜亚洲综合| 91久久午夜| 9国产精品视频| 国产精品欧美日韩久久| 久久精品一二三| 老司机免费视频一区二区三区| 91久久黄色| aⅴ色国产欧美| 国产人妖伪娘一区91| 久久亚洲影音av资源网| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲理伦在线| 亚洲一区二区三区中文字幕在线| 国内成人精品2018免费看| 欧美国产免费| 国产精品夫妻自拍| 免费欧美高清视频| 欧美视频一区二区| 久久久久久亚洲精品杨幂换脸 | 国内综合精品午夜久久资源| 欧美中文在线观看| 久久国产天堂福利天堂| 揄拍成人国产精品视频| 亚洲激情av| 国产精品久久久久久一区二区三区| 欧美一区二区三区播放老司机 | 亚洲视频综合在线| 亚洲图片欧美一区| 136国产福利精品导航网址| 亚洲日本成人网| 国产一区二区三区在线观看视频| 欧美成人免费大片| 国产精品免费看| 欧美寡妇偷汉性猛交| 国产精品永久| 亚洲国产天堂久久国产91| 国产精品亚洲综合一区在线观看| 欧美成人一品| 国产婷婷成人久久av免费高清| 亚洲激情一区二区| 在线观看福利一区| 亚洲欧美精品suv| 夜夜嗨av一区二区三区网站四季av| 欧美影院在线播放| 午夜精品久久久久久久久久久| 免费一级欧美片在线播放| 亚洲性图久久| 国产亚洲综合精品| 久久精品女人| 国产精品久久久久一区| 久久久久综合一区二区三区| 欧美精品久久久久久久| 久久亚洲综合网| 国产目拍亚洲精品99久久精品| 91久久精品国产91性色tv| 国产一区二区日韩精品| 亚洲精品欧美日韩专区| 亚洲黄色影片| 久久综合狠狠| 牛牛国产精品| 在线免费观看欧美| 午夜一区二区三视频在线观看 | 欧美激情综合在线| 欧美成人精品三级在线观看| 国产真实久久| 久久精品人人做人人爽| 久久婷婷综合激情| 黄色亚洲精品| 欧美在线不卡视频| 久久久久国产精品一区| 国内精品福利| 久久亚洲私人国产精品va| 美女精品一区| 亚洲精品日日夜夜| 欧美剧在线观看| av不卡在线看| 午夜精品影院| 国产一区高清视频| 久久久久九九九九| 欧美激情视频在线播放| 最新中文字幕一区二区三区| 欧美+亚洲+精品+三区| 亚洲国产黄色片| 一区二区三区久久久| 国产精品黄页免费高清在线观看| 亚洲一区日韩在线| 久久综合九色九九| 亚洲精品欧美精品| 欧美日韩在线免费| 午夜电影亚洲| 欧美电影免费观看高清| 中文精品视频| 国产无一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲国产欧美一区二区三区同亚洲 | 久久人人爽爽爽人久久久| 欧美激情中文字幕乱码免费| 99亚洲一区二区| 国产日韩综合| 欧美电影免费观看高清| 亚洲一区二区三区中文字幕| 你懂的视频一区二区| 亚洲欧美日韩爽爽影院| 亚洲一区二区三区777| 鲁鲁狠狠狠7777一区二区| 一区二区亚洲精品| 欧美~级网站不卡| 亚洲神马久久| 老妇喷水一区二区三区| 亚洲视频在线播放| 极品日韩久久| 国产精品国产三级国产普通话99| 久久福利资源站| 一本色道综合亚洲| 免费短视频成人日韩| 亚洲一区二区精品| 在线观看日韩欧美| 国产精品免费aⅴ片在线观看| 久久综合给合| 欧美一区二区高清| av成人黄色| 亚洲第一成人在线| 久久gogo国模裸体人体| 在线视频日韩精品| 亚洲国产精品www| 国产视频自拍一区| 欧美色偷偷大香| 欧美激情久久久久| 久久精品中文字幕免费mv| 国产精品99久久久久久有的能看 | 久热综合在线亚洲精品|