11.2 print
最后更新于:2022-04-01 06:23:08
在第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 ();
};
~~~
除了在行尾有一个分号以外,**函数声明**看起来很像函数定义的第一行。声明描述了函数的接口,也即参数数目和类型,以及返回值的类型。
声明一个函数的同时,也是在向编译器承诺你将在程序中提供函数定义。这里的定义有时也被称为函数的**实现**,因为它包含了函数工作的细节。如果你遗漏了定义,或者提供的函数的接口与你承诺的不同,编译器会抗议的。