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 北京多云,心情不好也不壞。要拓寬學習深度與廣度啊親~
新聞熱點
疑難解答
圖片精選