国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++派生類與嵌入類的構造函數(shù)解析

2019-11-08 18:47:33
字體:
來源:轉載
供稿:網友

1、今天呢遇到一個問題:

#defineMSG_FILENAME     1  

struct TMSG_HEADER

{

    char  cMsgID; 

    TMSG_HEADER(char MsgID = INVALID_MSG)

    : cMsgID(MsgID)

    {

    }

};

structTMSG_FILENAME :public TMSG_HEADER

{

    char szFileName[256]; 

    TMSG_FILENAME()

    : TMSG_HEADER(MSG_FILENAME)

    {

    }

};

 

第二個結構體的構造函數(shù)的寫法之前沒有看見過,之前只在構造函數(shù)冒號后面初始化參數(shù),并沒有類名,后來請教同學才得以解答,在此表示感謝~

其實是這樣的,在TMSG_FILENAME類的構造函數(shù)前導中,我們要給TMSG_HEADER類的構造函數(shù)傳遞參數(shù),我們完成這一點的方式是-----使用它的類名調用基構造函數(shù)。

TMSG_FILENAME():TMSG_HEADER(MSG_FILENAME)

{

}

其實本例中在TMSG_FILENAME類的構造函數(shù)前導中,從語法上來講,給TMSG_HEADER類的構造函數(shù)傳遞參數(shù)不是必須的,因為TMSG_HEADER有個默認缺省構造函數(shù),但是從功能上講是有用的。如果TMSG_HEADER的構造函數(shù)改成如下:

 

TMSG_HEADER(charMsgID ): cMsgID(MsgID)

{

}

則是必須的。

 

2、另外強調一點,構建的順序非常重要,首先構建基類,然后構建派生類,如下所示:

structTMSG_FILELENGTH : public TMSG_HEADER

{

        long lLength;

 

        TMSG_FILELENGTH(long length)

        : TMSG_HEADER(MSG_FILELENGTH),lLength(length)

        {

 

        }

};

 

3、前面講了繼承,是對象間重要的“is a”的關系,還有一種“has a”的關系是對象嵌入,構造函數(shù)與上面的寫法類似,如下所示:

class Matter

{

public:

        Matter(int id)

          : _identifier(id)

          {

          }

          ~Matter()

          {

          }

PRivate:

          const int _identifier;

};

 

class World

{

public:

          World(int id)

          : _identifier(id),

          _matter(_identifier)  //初始化嵌入體

          {

          }

          ~World()

          {

          }

private:

          const int _identifier;

          const Matter _matter;  //Matter類型的嵌入對象

};

int main()

{

          World smallWorld(3);

}

此例有意思的地方是World構造函數(shù)的前導:

World(int id)

: _identifier(id),_matter(_identifier)  //初始化嵌入體

 

它首先初始化_identifier,然后初始化_matter。初始化某個對象意味著調用它的構造函數(shù),Matter的構造函數(shù)需要一個整數(shù),這是我們要傳遞的值,基于讓_identifier成為常量的同樣原因,我們也讓_matter成為常量,它在World的生存期永遠不會改變,它們在前導中初始化,而且永遠不能改變,甚至不能被任何人訪問。現(xiàn)在,我們感到奇怪的是初始化的順序與前導中的初始化器順序毫無關系。事實上,如果嵌入對象的構造函數(shù)不需要任何參數(shù),它可以在前導中完全被忽略,如果不需要顯示初始化,整個前導均可以完全被忽略。相反,初始化的規(guī)則是:數(shù)據(jù)成員按它們在類定義中的出現(xiàn)順序進行初始化。

因為在World的定義中,_identifier出現(xiàn)在_matter之前,所以_identifier首先被初始化,這就是為什么我們可以在_matter 構造函數(shù)中使用它的值的原因。C++中嵌入體的順序與語句的順序同等重要。

第3部分文字大部分來自書籍,由于書籍是同學為我解答問題給我發(fā)的照片,所以我并不知道書籍名稱,見諒見諒!如有不當,請告知~

 

2017.2.16   北京多云,心情不好也不壞。要拓寬學習深度與廣度啊親~

 

 

 

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 绥江县| 洛浦县| 新津县| 会昌县| 仪陇县| 雅安市| 石屏县| 梁山县| 雅江县| 博乐市| 辽中县| 龙口市| 大石桥市| 天津市| 五大连池市| 商洛市| 葵青区| 永福县| 金塔县| 广南县| 伽师县| 公主岭市| 石阡县| 青海省| 买车| 张家川| 太原市| 松桃| 仪征市| 鄂伦春自治旗| 扶风县| 昔阳县| 屏南县| 刚察县| 双峰县| 那曲县| 裕民县| 收藏| 博爱县| 波密县| 南靖县|