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

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

關(guān)于初始化C++類成員,也稱初始化列表

Posted on 2011-04-19 23:04 RTY 閱讀(256) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

在使用C++編程的過程中,常常需要對類成員進(jìn)行初始化,通常的方法有兩種:

第一種方法:

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

第二種方法:

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

 

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

    從技術(shù)上說,第二種方法比較好,但是在大多數(shù)情況下,兩者實際上沒有什么區(qū)別。第二種語法被稱為成員初始化列表,之所以要使用這種語法有兩個原因:一個原因是必須這么做,另一個原因是出于效率考慮。

    讓我們先看一下第一個原因——必要性。設(shè)想你有一個類成員,它本身是一個類或者結(jié)構(gòu),而且只有一個帶一個參數(shù)的構(gòu)造函數(shù)。

 

class CMyClass {
CMember m_member;
public:
CMyClass();
};

 

// 必須使用初始化列表來初始化成員 m_memberCMyClass::CMyClass() : m_member(2){•••}
    沒有其它辦法將參數(shù)傳遞給m_member,如果成員是一個常量對象或者引用也是一樣。根據(jù)C++的規(guī)則,常量對象和引用不能被賦值,它們只能被初始化。

    使用初始化列表的第二個原因是出于效率考慮,當(dāng)成員類具有一個缺省的構(gòu)造函數(shù)和一個賦值操作符時。MFC的CString提供了一個完美的例子。假定你有一個類CMyClass具有一個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.")){}
    在它們之間有什么不同嗎?是的。編譯器總是確保所有成員對象在構(gòu)造函數(shù)體執(zhí)行之前被初始化,因此在第一個例子中編譯的代碼將調(diào)用CString::Cstring來初始化m_str,這在控制到達(dá)賦值語句前完成。在第二個例子中編譯器產(chǎn)生一個對CString:: CString(LPCTSTR)的調(diào)用并將"Hi,how are you."傳遞給這個函數(shù)。結(jié)果是在第一個例子中調(diào)用了兩個CString函數(shù)(構(gòu)造函數(shù)和賦值操作符),而在第二個例子中只調(diào)用了一個函數(shù)。

    在CString的例子里這是無所謂的,因為缺省構(gòu)造函數(shù)是內(nèi)聯(lián)的,CString只是在需要時為字符串分配內(nèi)存(即,當(dāng)你實際賦值時)。但是,一般而言,重復(fù)的函數(shù)調(diào)用是浪費資源的,尤其是當(dāng)構(gòu)造函數(shù)和賦值操作符分配內(nèi)存的時候。在一些大的類里面,你可能擁有一個構(gòu)造函數(shù)和一個賦值操作符都要調(diào)用同一個負(fù)責(zé)分配大量內(nèi)存空間的Init函數(shù)。在這種情況下,你必須使用初始化列表,以避免不要的分配兩次內(nèi)存。

    在內(nèi)建類型如ints或者longs或者其它沒有構(gòu)造函數(shù)的類型下,在初始化列表和在構(gòu)造函數(shù)體內(nèi)賦值這兩種方法沒有性能上的差別。不管用那一種方法,都只會有一次賦值發(fā)生。有些程序員說你應(yīng)該總是用初始化列表以保持良好習(xí)慣,但我從沒有發(fā)現(xiàn)根據(jù)需要在這兩種方法之間轉(zhuǎn)換有什么困難。在編程風(fēng)格上,我傾向于在主體中使用賦值,因為有更多的空間用來格式化和添加注釋,你可以寫出這樣的語句:
x=y=z=0;
或者
memset(this,0,sizeof(this));
注意第二個片斷絕對是非面向?qū)ο蟮摹?/span>

    當(dāng)我考慮初始化列表的問題時,有一個奇怪的特性我應(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){}
    你可能以為上面的代碼將會首先做m_y=i,然后做m_x=m_y,最后它們有相同的值。但是編譯器先初始化m_x,然后是m_y,,因為它們是按這樣的順序聲明的。結(jié)果是m_x將有一個不可預(yù)測的值。這個例子是故意這樣設(shè)計來說明這一點的,然而這種bug會很自然地出現(xiàn)。有兩種方法避免它,一個是總是按照你希望它們被初始化的順序來聲明成員,第二個是,如果你決定使用初始化列表,總是按照它們聲明的順序羅列這些成員。這將有助于消除混淆。

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

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

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久综合一区| 国产精品乱码久久久久久| 国产一区三区三区| 久久久五月天| 久久久999国产| 亚洲国产乱码最新视频| 亚洲国产成人porn| 欧美黑人一区二区三区| 中文在线一区| 亚洲综合清纯丝袜自拍| 国内精品免费午夜毛片| 欧美sm视频| 欧美精品免费视频| 欧美亚洲网站| 久久久欧美一区二区| 亚洲精品欧美日韩| 这里只有精品电影| 国产在线拍揄自揄视频不卡99| 老巨人导航500精品| 欧美精品 国产精品| 亚洲综合色婷婷| 久久久久se| 一本色道久久综合亚洲精品按摩 | 永久免费精品影视网站| 免费观看在线综合色| 欧美日本免费一区二区三区| 午夜久久影院| 欧美xart系列高清| 午夜亚洲性色福利视频| 久久这里有精品视频| 亚洲天堂av电影| 久久久精品欧美丰满| 亚洲无限av看| 欧美aa国产视频| 欧美在线www| 欧美精品一区二区三区很污很色的 | 一区二区欧美精品| 欧美一级电影久久| 亚洲午夜精品久久久久久浪潮| 久久久久久**毛片大全| 亚洲午夜av| 欧美成人精品不卡视频在线观看| 久久激五月天综合精品| 欧美日韩一级片在线观看| 欧美成人激情视频免费观看| 国产精品综合久久久| 99精品欧美| 亚洲精品免费电影| 久久综合久久综合久久综合| 欧美诱惑福利视频| 欧美性一区二区| 亚洲免费观看高清完整版在线观看| 极品中文字幕一区| 久久成人精品| 久久精品视频va| 国产欧美精品一区二区三区介绍| 91久久极品少妇xxxxⅹ软件| 在线欧美亚洲| 久久综合色8888| 男男成人高潮片免费网站| 国产真实乱偷精品视频免| 亚洲欧美在线一区| 欧美亚洲在线视频| 国产精品高清一区二区三区| 99精品欧美一区二区三区| 9色国产精品| 欧美人成网站| 一区二区三区高清在线| 中日韩高清电影网| 国产精品大全| 亚洲一二三区精品| 欧美一区二区黄色| 国产一区二区三区日韩欧美| 午夜综合激情| 久久亚洲一区二区| 亚洲国产精品v| 玖玖玖免费嫩草在线影院一区| 欧美成人黄色小视频| 日韩午夜视频在线观看| 欧美精品在线一区| 夜夜嗨av一区二区三区免费区| 亚洲女同性videos| 国产亚洲高清视频| 久久久夜夜夜| 亚洲欧洲日本一区二区三区| 一区二区三区波多野结衣在线观看| 欧美日韩午夜在线| 亚洲男人第一网站| 狼狼综合久久久久综合网| 亚洲人成77777在线观看网| 欧美精品福利在线| 亚洲影院在线观看| 久久在线免费视频| 一本久道久久综合婷婷鲸鱼| 国产精品久久国产精品99gif| 午夜久久一区| 亚洲电影第1页| 亚洲欧美一区二区在线观看| 黑人一区二区三区四区五区| 欧美大片国产精品| 亚洲一区二区毛片| 欧美成人精品一区| 亚洲一区二区三区四区在线观看| 国产丝袜美腿一区二区三区| 女人香蕉久久**毛片精品| 亚洲天堂成人| 欧美成人一区二区三区| 亚洲资源av| 亚洲人妖在线| 国产亚洲欧美一区二区| 欧美精品九九| 久久偷看各类wc女厕嘘嘘偷窃| 日韩午夜三级在线| 欧美不卡高清| 久久精品一区二区三区不卡牛牛| 亚洲精品国精品久久99热| 国产欧美日韩高清| 欧美日韩亚洲高清一区二区| 久久精品一区蜜桃臀影院| 亚洲视频在线一区观看| 亚洲国产欧美一区二区三区同亚洲 | 亚洲第一中文字幕在线观看| 欧美四级电影网站| 免费黄网站欧美| 久久久久久电影| 在线中文字幕一区| 亚洲精品久久久久久久久| 免费成人av在线看| 久久天堂成人| 久久久999精品| 欧美一区二区三区视频在线观看| 一区二区日韩伦理片| 91久久久在线| ●精品国产综合乱码久久久久| 国产欧美大片| 国产精品一区一区| 国产精品亚发布| 国产精品免费视频观看| 欧美特黄一区| 欧美日韩在线播| 欧美日韩在线看| 欧美午夜免费电影| 欧美性事在线| 国产精品亚洲аv天堂网| 国产精品日韩高清| 国产欧美日韩高清| 国产一区二区日韩精品欧美精品| 国产精品成人一区| 国产精品久久久久久久免费软件| 欧美视频在线一区二区三区| 欧美色播在线播放| 欧美午夜免费| 国产欧美激情| 国产欧美在线播放| 国产亚洲一区二区三区| 国产日本欧美一区二区三区| 国产亚洲成人一区| 在线视频国内自拍亚洲视频| 在线观看不卡| 在线视频日韩精品| 亚洲欧美偷拍卡通变态| 久久成人国产精品| 免费亚洲视频| 99re这里只有精品6| 亚洲午夜黄色| 久久久精品国产免费观看同学| 久久中文字幕一区| 欧美日韩大陆在线| 国产伦精品一区二区三区照片91 | 一本色道久久综合| 亚洲一区二区成人在线观看| 欧美在线视频播放| 欧美大片一区二区三区| 99re热这里只有精品视频| 亚洲欧美另类在线| 美女在线一区二区| 欧美亚洲成人精品| 好吊日精品视频| 正在播放欧美一区| 久久久综合视频| 亚洲欧洲日夜超级视频| 亚洲女同同性videoxma| 美女免费视频一区| 国产精品羞羞答答| 亚洲精品日韩欧美| 久久精品30| 亚洲人成在线播放| 欧美一区激情| 欧美色区777第一页| 国内在线观看一区二区三区| 一本色道久久综合亚洲精品婷婷| 久久频这里精品99香蕉| 亚洲精品一区在线| 欧美一级淫片播放口| 欧美日韩国产免费| 在线免费观看一区二区三区| 欧美一乱一性一交一视频| 亚洲第一二三四五区| 久久精彩免费视频| 国产精品手机视频|