C++ print

2023-03-20 16:02 更新

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

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

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

要調用這個函數(shù),我們需要傳遞一個Time對象作為參數(shù)。

Time currentTime = { 9, 14, 30.0 };
printTime(currentTime);

為把printTime轉變?yōu)槌蓡T函數(shù),第一步要將函數(shù)名由printTime改成Time::print。::操作符使結構體名字和函數(shù)名分離開,它們同樣表明print函數(shù)能在Time結構體上調用。

下一步是消去參數(shù)。我們將在對象上調用這個函數(shù),而不是將對象作為實參傳遞給函數(shù)。

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

有一件難以理解的事情是,這里的this實際上是一個指向結構的指針,而不是結構本身。指針和引用類似,但現(xiàn)在我還不想討論指針使用的細節(jié)。我們現(xiàn)在唯一需要的指針操作符是*操作符,它把一個結構體指針轉化成結構體,在如下函數(shù)中,我們用它把this的值賦給局部變量time。

void Time::print() {
  Time time = *this;
  cout << time.hour << ":" << time.minute << ":" << time.second << endl;
}

當我們把函數(shù)轉變成成員函數(shù)時,函數(shù)的前兩行改變了不少,但是請注意輸出語句完全沒有變化。

為了調用新版的print,我們需要在一個Time對象上調用它:

Time currentTime = { 9, 14, 30.0 };
currentTime.print();

轉變過程的最后一步是在結構體定義中聲明這一函數(shù):

struct Time {
  int hour, minute;
  double second;

  void Time::print ();
};

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

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

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號