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

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>
            韩国一区二区三区美女美女秀| 夜夜爽av福利精品导航| 久久激情婷婷| 9久草视频在线视频精品| 老司机精品久久| 国产午夜久久| 亚洲一区欧美激情| 99精品欧美一区| 欧美日韩免费在线视频| 亚洲精品国产精品国自产观看浪潮| 六月婷婷久久| 久久久久久久国产| 伊人久久久大香线蕉综合直播| 久久久久se| 久久er99精品| 激情综合网址| 免费看黄裸体一级大秀欧美| 欧美伊人久久| 国产综合18久久久久久| 久久久久久亚洲精品杨幂换脸| 午夜一区不卡| 国产亚洲欧美在线| 卡通动漫国产精品| 久久久久久网| 亚洲高清不卡av| 亚洲高清一区二区三区| 久久久久久穴| 亚洲精品国产日韩| 亚洲美女av在线播放| 国产精品久久国产三级国电话系列| 亚洲欧美日韩视频二区| 性做久久久久久久久| 一区二区三区在线视频免费观看| 农夫在线精品视频免费观看| 免费成人av在线看| 亚洲一二三四区| 亚洲欧美激情一区| 亚洲国产精品尤物yw在线观看| 亚洲精品视频免费观看| 国产精品久久久亚洲一区| 久久精品中文| 欧美久久精品午夜青青大伊人| 亚洲欧美偷拍卡通变态| 久久米奇亚洲| 先锋资源久久| 欧美11—12娇小xxxx| 午夜国产精品视频| 久久综合久久综合久久| 亚洲影院高清在线| 久久久综合精品| 亚洲小说欧美另类社区| 久久久999| 亚洲欧美另类中文字幕| 久久伊人免费视频| 亚洲在线视频| 免费看成人av| 欧美诱惑福利视频| 欧美日韩国产va另类| 久久伊人一区二区| 欧美日韩在线观看一区二区| 猛干欧美女孩| 国产精品日韩欧美大师| 亚洲电影观看| 国产三区二区一区久久| 欧美一级日韩一级| 久久伊人亚洲| 欧美日韩一二三区| 欧美77777| 国产视频精品va久久久久久| 亚洲第一视频网站| 国产手机视频一区二区| 一本久久a久久精品亚洲| 一区二区三区在线观看视频| 亚洲欧美在线看| 亚洲综合色丁香婷婷六月图片| 老司机67194精品线观看| 久久精品综合一区| 国产欧美日韩视频| 亚洲线精品一区二区三区八戒| 一本色道婷婷久久欧美| 麻豆成人精品| 另类专区欧美制服同性| 国产欧美一区二区精品婷婷| 一区二区三区 在线观看视| 亚洲久久成人| 欧美高清自拍一区| 亚洲国产高清在线| 亚洲人成绝费网站色www| 久久九九全国免费精品观看| 久久免费99精品久久久久久| 国产一区二区中文| 欧美在线国产| 久久综合久色欧美综合狠狠| 国产亚洲福利| 久久国产日本精品| 另类激情亚洲| 亚洲福利免费| 欧美不卡三区| 亚洲日本一区二区三区| 99成人免费视频| 欧美日韩不卡在线| 一级成人国产| 午夜精品久久久久久99热软件| 国产精品乱码| 午夜精品理论片| 久久先锋影音| 亚洲人体1000| 欧美日韩美女在线观看| 亚洲视频在线观看三级| 性8sex亚洲区入口| 狠狠色综合色区| 欧美国产激情| 亚洲视频图片小说| 久久精品国产91精品亚洲| 在线观看日韩av| 欧美精品在线观看91| 一区二区电影免费观看| 久久激情视频免费观看| 亚洲第一综合天堂另类专| 欧美激情一二三区| 亚洲已满18点击进入久久| 久久免费观看视频| 99热免费精品| 国产欧美欧洲在线观看| 久久婷婷人人澡人人喊人人爽| 亚洲欧洲另类国产综合| 小处雏高清一区二区三区| 亚洲高清免费| 国产精品婷婷| 欧美/亚洲一区| 亚洲欧美日本伦理| 欧美激情a∨在线视频播放| 亚洲一区国产精品| 亚洲电影观看| 国产精品免费网站| 欧美精品亚洲二区| 日韩视频第一页| 国产精品久久久久久久一区探花| 香蕉免费一区二区三区在线观看| 亚洲电影在线播放| 欧美在线免费观看亚洲| 亚洲精品一区二区三区樱花| 国产欧美日韩不卡免费| 欧美啪啪一区| 久久国产夜色精品鲁鲁99| 日韩视频免费在线| 欧美成人精品在线观看| 欧美中文字幕| 中日韩男男gay无套| 影音先锋中文字幕一区| 国产精品一卡二卡| 欧美日韩亚洲综合在线| 免费永久网站黄欧美| 亚洲欧美一区二区视频| 夜夜嗨av一区二区三区网站四季av | 嫩草国产精品入口| 亚洲欧美精品中文字幕在线| 亚洲精品1区2区| 欧美成人精品在线观看| 久久一二三国产| 欧美在线视频a| 亚洲午夜免费视频| 亚洲免费观看高清完整版在线观看熊 | 欧美日韩久久精品| 欧美成人国产一区二区| 久久青青草综合| 欧美一区二区三区免费视| 亚洲天堂成人| 中文国产亚洲喷潮| 日韩一区二区精品| 亚洲欧洲精品一区二区精品久久久| 免费成人激情视频| 久久久综合激的五月天| 久久精品成人| 久久av在线看| 久久精品国产欧美亚洲人人爽| 香港久久久电影| 欧美在线观看网址综合| 欧美一区二区三区男人的天堂 | 欧美亚洲一区二区在线| 亚洲欧美日韩一区二区三区在线| 亚洲视频在线观看网站| av成人手机在线| 一本一本久久a久久精品综合麻豆| 亚洲精品日韩久久| 夜夜狂射影院欧美极品| 一本色道久久88亚洲综合88| 亚洲视频精选| 香蕉久久夜色精品| 久久久欧美一区二区| 免费观看成人| 亚洲欧洲日夜超级视频| 一区二区三区欧美激情| 亚洲一区二区欧美日韩| 欧美一级淫片播放口| 久久综合九色九九| 欧美日韩1区2区3区| 国产精品揄拍一区二区| 精品福利免费观看| 亚洲国产人成综合网站|