牛骨文教育服务平台(让学习变的简单)

在第9章中,我们定义了Time结构体并写了一个printTime函数

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

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

要调用这个函数,我们需要传递一个Time对象作为参数。

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

为把printTime转变为成员函数,第一步要将函数名由printTime改成Time::print。::操作符使结构体名字和函数名分离开,它们同样表明print函数能在Time结构体上调用。

下一步是消去参数。我们将在对象上调用这个函数,而不是将对象作为实参传递给函数。

因此,在函数中,我们不再有一个time参数,取而代之的是当前对象,即函数在这个对象上调用。可以使用C++关键字this来引用当前对象。

有一件难以理解的事情是,这里的this实际上是一个指向结构的指针,而不是结构本身。指针和引用类似,但现在我还不想讨论指针使用的细节。我们现在唯一需要的指针操作符是*操作符,它把一个结构体指针转化成结构体,在如下函数中,我们用它把this的值赋给局部变量time。

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

当我们把函数转变成成员函数时,函数的前两行改变了不少,但是请注意输出语句完全没有变化。

为了调用新版的print,我们需要在一个Time对象上调用它:

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

转变过程的最后一步是在结构体定义中声明这一函数:

struct Time {
  int hour, minute;
  double second;

  void Time::print ();
};

除了在行尾有一个分号以外,函数声明看起来很像函数定义的第一行。声明描述了函数的接口,也即参数数目和类型,以及返回值的类型。

声明一个函数的同时,也是在向编译器承诺你将在程序中提供函数定义。这里的定义有时也被称为函数的实现,因为它包含了函数工作的细节。如果你遗漏了定义,或者提供的函数的接口与你承诺的不同,编译器会抗议的。