企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
在第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 (); }; ~~~ 除了在行尾有一个分号以外,**函数声明**看起来很像函数定义的第一行。声明描述了函数的接口,也即参数数目和类型,以及返回值的类型。 声明一个函数的同时,也是在向编译器承诺你将在程序中提供函数定义。这里的定义有时也被称为函数的**实现**,因为它包含了函数工作的细节。如果你遗漏了定义,或者提供的函数的接口与你承诺的不同,编译器会抗议的。