如果今天早上在Pgs的账户上花费了2小时35分钟,下午又花费了2小时40分钟,则总共花了多少时间呢?这个示例与加法概念很吻合,但要相加的单位(小时与分钟的混合)与内置类型不匹配。第7章通过定义一个 travel time结构和将这种结构相加的sum()函数来处理类似的情况。现在将其推广,采用一个使用方法来处理加法的Time类。首先使用一个名为Sum()的常规方法,然后介绍如何将其转换为重载运算符。程序清单11.1列出了这个类的声明。
//mytime0.h --Time class before operator overloading#ifdefine MYTIME_H_#define MYTIME_H_class Time{private:int hours;int minutes;public:Time();Time(int h,int m=0);void AddMin(int m);void AddHr(int h);void Reset(int h=0,int m=0);Time Sum(const Time & t) const;void Show() const;}#endif
Time类提供了用于调整和重新设置时间、显示时间、将两个时间相加的方法。程序清单11.2列出了方法定义。请注意,当总的分钟数超过59时, AdmIn()和Sum()方法是如何使用整数除法和求模运算符来调整 minutes和 hours值的。另外,由于这里只使用了 Iostream的cout,且只使用了一次,因此使用 std:cout比导入整个名称空间更经济。
#ingclude <iostream>#include "mytime0.h"Time::Time(){hours=minutes=0;}Time::Time(int h,int m){hours=h;minutes=m;}void Time::AddMin(int m){minutes+=m;hours+=minutes/60;minutes%=60;}void Time::AddHr(int h){hours+=h;}void Time::Reset(int h,int m){hours=h;minutes=m;}Time Time::Sum(const Time &t) const{Time sum;sum.minutes=minutes+t.minutes;sum.hours=hours+t.hours+sum.minutes/60;sum.minutes %=60;return sum;}void Time::Show() const{std::cout<<hours<<" hours, "<<minutes<<" minutes";}
来看一下Sum()函数的代码。注意参数是引用,但返回类型却不是引用。将参数声明为引用的目的是为了提高效率。如果按值传递Time对象,代码的功能将相同,但传递引用,速度将更快,使用的内存将更少。
然而,返回值不能是引用。因为函数将创建一个新的Time对象(sum),来表示另外两个Time对象的和。返回对象(如代码所做的那样)将创建对象的副本,而调用函数可以使用它。然而,如果返回类型为Time&,则引用的将是sum对象。但由于sum对象是局部变量,在函数结束时将被删除,因此引用将指向一个不存在的对象。使用返回类型Time意味着程序将在删除sum之前构造它的拷贝,调用函数将得到该拷贝。
警告:不要返回指向局部变量或临时对象的引用。函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据。
最后,程序清单11.3对Time类中计算时间总和的部分进行了测试。
#include<iostream>#include"mytime0.h"int main(){using std::cout;using std::endl;Time planning;Time coding(2,40);Time fixing(5,55);Time total;cout<<"planing time=";planning.Show();cout<<endl;cout<<"coding time=";coding.Show();cout<<endl;cout<<"fixing time=";fixing.Show();cout<<endl;total=coding.Sum(fixing);cout<<"coding.Sum(fixing)=";total.Show();cout<<endl;return 0;

