C++ print

2023-03-20 16:02 更新

在第9章中,我們定義了Time結(jié)構(gòu)體并寫了一個printTime函數(shù)

struct Time {
  int hour, minute;
  double second;
}

void printTime(const Time& time) {
  cout << time.hour << ":" << time.minute << ":" << time.second << endl;
}

要調(diào)用這個函數(shù),我們需要傳遞一個Time對象作為參數(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ù)。我們將在對象上調(diào)用這個函數(shù),而不是將對象作為實參傳遞給函數(shù)。

因此,在函數(shù)中,我們不再有一個time參數(shù),取而代之的是當(dāng)前對象,即函數(shù)在這個對象上調(diào)用??梢允褂肅++關(guān)鍵字this來引用當(dāng)前對象。

有一件難以理解的事情是,這里的this實際上是一個指向結(jié)構(gòu)的指針,而不是結(jié)構(gòu)本身。指針和引用類似,但現(xiàn)在我還不想討論指針使用的細(xì)節(jié)。我們現(xiàn)在唯一需要的指針操作符是*操作符,它把一個結(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ù)的前兩行改變了不少,但是請注意輸出語句完全沒有變化。

為了調(diào)用新版的print,我們需要在一個Time對象上調(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 ();
};

除了在行尾有一個分號以外,函數(shù)聲明看起來很像函數(shù)定義的第一行。聲明描述了函數(shù)的接口,也即參數(shù)數(shù)目和類型,以及返回值的類型。

聲明一個函數(shù)的同時,也是在向編譯器承諾你將在程序中提供函數(shù)定義。這里的定義有時也被稱為函數(shù)的實現(xiàn),因為它包含了函數(shù)工作的細(xì)節(jié)。如果你遺漏了定義,或者提供的函數(shù)的接口與你承諾的不同,編譯器會抗議的。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號