W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在第9章中,我們定義了Time結(jié)構(gòu)體并寫了一個(gè)printTime函數(shù)
struct Time {
int hour, minute;
double second;
}
void printTime(const Time& time) {
cout << time.hour << ":" << time.minute << ":" << time.second << endl;
}
要調(diào)用這個(gè)函數(shù),我們需要傳遞一個(gè)Time對(duì)象作為參數(shù)。
Time currentTime = { 9, 14, 30.0 };
printTime(currentTime);
為把printTime轉(zhuǎn)變?yōu)槌蓡T函數(shù),第一步要將函數(shù)名由printTime改成Time::print。::操作符使結(jié)構(gòu)體名字和函數(shù)名分離開,它們同樣表明print函數(shù)能在Time結(jié)構(gòu)體上調(diào)用。
下一步是消去參數(shù)。我們將在對(duì)象上調(diào)用這個(gè)函數(shù),而不是將對(duì)象作為實(shí)參傳遞給函數(shù)。
因此,在函數(shù)中,我們不再有一個(gè)time參數(shù),取而代之的是當(dāng)前對(duì)象,即函數(shù)在這個(gè)對(duì)象上調(diào)用??梢允褂肅++關(guān)鍵字this來引用當(dāng)前對(duì)象。
有一件難以理解的事情是,這里的this實(shí)際上是一個(gè)指向結(jié)構(gòu)的指針,而不是結(jié)構(gòu)本身。指針和引用類似,但現(xiàn)在我還不想討論指針使用的細(xì)節(jié)。我們現(xiàn)在唯一需要的指針操作符是*操作符,它把一個(gè)結(jié)構(gòu)體指針轉(zhuǎn)化成結(jié)構(gòu)體,在如下函數(shù)中,我們用它把this的值賦給局部變量time。
void Time::print() {
Time time = *this;
cout << time.hour << ":" << time.minute << ":" << time.second << endl;
}
當(dāng)我們把函數(shù)轉(zhuǎn)變成成員函數(shù)時(shí),函數(shù)的前兩行改變了不少,但是請(qǐng)注意輸出語句完全沒有變化。
為了調(diào)用新版的print,我們需要在一個(gè)Time對(duì)象上調(diào)用它:
Time currentTime = { 9, 14, 30.0 };
currentTime.print();
轉(zhuǎn)變過程的最后一步是在結(jié)構(gòu)體定義中聲明這一函數(shù):
struct Time {
int hour, minute;
double second;
void Time::print ();
};
除了在行尾有一個(gè)分號(hào)以外,函數(shù)聲明看起來很像函數(shù)定義的第一行。聲明描述了函數(shù)的接口,也即參數(shù)數(shù)目和類型,以及返回值的類型。
聲明一個(gè)函數(shù)的同時(shí),也是在向編譯器承諾你將在程序中提供函數(shù)定義。這里的定義有時(shí)也被稱為函數(shù)的實(shí)現(xiàn),因?yàn)樗撕瘮?shù)工作的細(xì)節(jié)。如果你遺漏了定義,或者提供的函數(shù)的接口與你承諾的不同,編譯器會(huì)抗議的。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: