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

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

關于初始化C++類成員,也稱初始化列表

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

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

第一種方法:

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

第二種方法:

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

 

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

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

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

 

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

 

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

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

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

    在內建類型如ints或者longs或者其它沒有構造函數的類型下,在初始化列表和在構造函數體內賦值這兩種方法沒有性能上的差別。不管用那一種方法,都只會有一次賦值發(fā)生。有些程序員說你應該總是用初始化列表以保持良好習慣,但我從沒有發(fā)現根據需要在這兩種方法之間轉換有什么困難。在編程風格上,我傾向于在主體中使用賦值,因為有更多的空間用來格式化和添加注釋,你可以寫出這樣的語句:
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會很自然地出現。有兩種方法避免它,一個是總是按照你希望它們被初始化的順序來聲明成員,第二個是,如果你決定使用初始化列表,總是按照它們聲明的順序羅列這些成員。這將有助于消除混淆。

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

因為CMember有一個顯式聲明的構造函數,編譯器不產生一個缺省構造函數(不帶參數),所以沒有一個整數就無法創(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>
            99国产精品久久久久久久久久| 亚洲最新合集| 亚洲夫妻自拍| 欧美大尺度在线| 免费不卡欧美自拍视频| 亚洲欧洲综合另类| 91久久在线播放| 欧美喷水视频| 午夜久久tv| 欧美一站二站| 欧美国产日韩精品| 国产婷婷一区二区| 老鸭窝亚洲一区二区三区| 久久夜色精品国产欧美乱极品| 欧美日韩视频一区二区| 亚洲视频欧洲视频| 亚洲欧美日韩精品久久久| 有码中文亚洲精品| 亚洲九九爱视频| 国产日韩专区| 免费人成精品欧美精品| 欧美高清视频在线播放| 性欧美18~19sex高清播放| 欧美3dxxxxhd| 欧美伦理在线观看| 久久激情中文| 欧美刺激午夜性久久久久久久| 国产一区二区三区高清 | 欧美一级久久| 久久精品道一区二区三区| 亚洲精品国产日韩| 欧美高清在线一区二区| 欧美网站在线观看| 宅男噜噜噜66国产日韩在线观看| 欧美激情综合色| 久久免费视频网站| 亚洲图中文字幕| 久久亚洲视频| 欧美亚洲在线观看| 欧美极品色图| 你懂的视频一区二区| 国产精品你懂得| 亚洲精品乱码视频 | 久久av在线看| 欧美精品99| 免费视频一区二区三区在线观看| 久久久精彩视频| 在线观看91精品国产入口| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 国产精品美女久久久久aⅴ国产馆| 999亚洲国产精| 久久久91精品国产一区二区三区 | 欧美肉体xxxx裸体137大胆| 久久精品亚洲| 国产精品99免视看9| 亚洲国产另类精品专区| 极品少妇一区二区三区精品视频| 蜜桃av噜噜一区二区三区| 国产精品视频久久久| 日韩亚洲在线观看| 99爱精品视频| 欧美精品首页| 亚洲黄一区二区三区| 亚洲国产日韩一级| 麻豆av一区二区三区久久| 美女精品网站| 在线视频观看日韩| 久久久www成人免费精品| 久久一二三国产| 激情久久久久久久| 久久久精品性| 在线视频欧美日韩精品| 欧美精品一区二区三区蜜臀| 亚洲国产高清视频| 日韩一区二区久久| 欧美日韩美女在线观看| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 欧美一区二区三区精品电影| 久久久青草青青国产亚洲免观| 一区二区黄色| 欧美另类视频| 一本色道久久精品| 亚洲国产精品传媒在线观看 | av成人手机在线| 欧美日韩一区二区三区在线| 9久草视频在线视频精品| 亚洲一级黄色av| 国产精品女同互慰在线看| 亚洲欧美综合精品久久成人| 久久久久久久久久久久久久一区 | 欧美一区二区三区在| 久久久精品国产一区二区三区| 欧美另类极品videosbest最新版本| 欧美一激情一区二区三区| 国产亚洲一区二区精品| 久久免费视频这里只有精品| 亚洲电影在线播放| 亚洲综合精品四区| 激情婷婷亚洲| 欧美日韩福利在线观看| 亚洲欧美一区二区激情| 亚洲线精品一区二区三区八戒| 久久噜噜噜精品国产亚洲综合| 亚洲综合精品自拍| 国内精品视频在线观看| 欧美激情精品久久久| 欧美大片网址| 亚洲欧美国产高清| 欧美日韩一区二区在线播放| 亚洲第一在线视频| 欧美一级在线播放| 亚洲欧洲在线看| 国产日韩在线看片| 欧美激情日韩| 久久精品国产精品亚洲精品| 亚洲三级影片| 欧美99久久| 欧美在线看片a免费观看| 亚洲精品免费一二三区| 免费在线欧美视频| 亚洲欧美在线免费| 亚洲美女区一区| 免费成人黄色片| 欧美一区二区三区在| 在线视频欧美精品| 亚洲激情网站免费观看| 国产自产在线视频一区| 国产精品久久久亚洲一区| 欧美激情欧美狂野欧美精品| 亚洲精品在线观看视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 曰本成人黄色| 国产亚洲一区二区精品| 国产伦精品一区二区三区高清版| 午夜精品久久| 中日韩高清电影网| 久久国产色av| 欧美一区二区三区四区在线| 好吊色欧美一区二区三区四区 | 亚洲韩国青草视频| 一区二区日韩伦理片| 亚洲国产mv| 在线免费观看日本欧美| 一区二区在线视频播放| 国内精品福利| 狠狠色伊人亚洲综合成人| 国产亚洲成人一区| 国产一区二区成人久久免费影院| 久久美女性网| 亚洲免费成人av电影| 亚洲精品中文字幕有码专区| 亚洲黄色av一区| 91久久久精品| 亚洲美女色禁图| 亚洲视频在线观看一区| 亚洲午夜在线观看| 香蕉久久a毛片| 久久高清一区| 裸体丰满少妇做受久久99精品 | 久久久99爱| 亚洲精品国产日韩| 99精品视频免费观看| 这里只有精品丝袜| 香蕉久久夜色精品国产| 久久精品国语| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲福利视频网| 91久久久国产精品| 一区二区三区国产| 欧美一区二区国产| 久久久久综合网| 欧美精品v日韩精品v韩国精品v| 欧美亚洲视频在线看网址| 久久精品国产亚洲a| 欧美高清视频| 久久久久久久久久看片| 亚洲午夜91| 久久视频免费观看| 欧美日韩视频在线观看一区二区三区| 久久国产福利| 欧美国产综合| 国产麻豆午夜三级精品| 亚洲国产影院| 亚洲高清激情| 亚洲在线视频观看| 亚洲网站在线播放| 久久深夜福利免费观看| 亚洲欧洲日产国产网站| 羞羞漫画18久久大片| 欧美99在线视频观看| 麻豆av福利av久久av| 国产精品国产自产拍高清av王其| 欧美日韩国产综合在线| 韩日精品视频| 亚洲一区二区三区成人在线视频精品 | 蜜桃久久av一区| 国产精品日韩二区| 夜夜精品视频一区二区| 久久青草久久| 亚洲午夜久久久久久久久电影院|