如果今天早上在Pgs的账户上花费了2小时35分钟,下午又花费了2小时40分钟,则总共花了多少时间呢?这个示例与加法概念很吻合,但要相加的单位(小时与分钟的混合)与内置类型不匹配。第7章通过定义一个 travel time结构和将这种结构相加的sum()函数来处理类似的情况。现在将其推广,采用一个使用方法来处理加法的Time类。首先使用一个名为Sum()的常规方法,然后介绍如何将其转换为重载运算符。程序清单11.1列出了这个类的声明。

    1. //mytime0.h --Time class before operator overloading
    2. #ifdefine MYTIME_H_
    3. #define MYTIME_H_
    4. class Time
    5. {
    6. private:
    7. int hours;
    8. int minutes;
    9. public:
    10. Time();
    11. Time(int h,int m=0);
    12. void AddMin(int m);
    13. void AddHr(int h);
    14. void Reset(int h=0,int m=0);
    15. Time Sum(const Time & t) const;
    16. void Show() const;
    17. }
    18. #endif

    Time类提供了用于调整和重新设置时间、显示时间、将两个时间相加的方法。程序清单11.2列出了方法定义。请注意,当总的分钟数超过59时, AdmIn()和Sum()方法是如何使用整数除法和求模运算符来调整 minutes和 hours值的。另外,由于这里只使用了 Iostream的cout,且只使用了一次,因此使用 std:cout比导入整个名称空间更经济。

    1. #ingclude <iostream>
    2. #include "mytime0.h"
    3. Time::Time()
    4. {
    5. hours=minutes=0;
    6. }
    7. Time::Time(int h,int m)
    8. {
    9. hours=h;
    10. minutes=m;
    11. }
    12. void Time::AddMin(int m)
    13. {
    14. minutes+=m;
    15. hours+=minutes/60;
    16. minutes%=60;
    17. }
    18. void Time::AddHr(int h)
    19. {
    20. hours+=h;
    21. }
    22. void Time::Reset(int h,int m)
    23. {
    24. hours=h;
    25. minutes=m;
    26. }
    27. Time Time::Sum(const Time &t) const
    28. {
    29. Time sum;
    30. sum.minutes=minutes+t.minutes;
    31. sum.hours=hours+t.hours+sum.minutes/60;
    32. sum.minutes %=60;
    33. return sum;
    34. }
    35. void Time::Show() const
    36. {
    37. std::cout<<hours<<" hours, "<<minutes<<" minutes";
    38. }

    来看一下Sum()函数的代码。注意参数是引用,但返回类型却不是引用。将参数声明为引用的目的是为了提高效率。如果按值传递Time对象,代码的功能将相同,但传递引用,速度将更快,使用的内存将更少。
    然而,返回值不能是引用。因为函数将创建一个新的Time对象(sum),来表示另外两个Time对象的和。返回对象(如代码所做的那样)将创建对象的副本,而调用函数可以使用它。然而,如果返回类型为Time&,则引用的将是sum对象。但由于sum对象是局部变量,在函数结束时将被删除,因此引用将指向一个不存在的对象。使用返回类型Time意味着程序将在删除sum之前构造它的拷贝,调用函数将得到该拷贝。

    警告:不要返回指向局部变量或临时对象的引用。函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据。

    最后,程序清单11.3对Time类中计算时间总和的部分进行了测试。

    1. #include<iostream>
    2. #include"mytime0.h"
    3. int main()
    4. {
    5. using std::cout;
    6. using std::endl;
    7. Time planning;
    8. Time coding(2,40);
    9. Time fixing(5,55);
    10. Time total;
    11. cout<<"planing time=";
    12. planning.Show();
    13. cout<<endl;
    14. cout<<"coding time=";
    15. coding.Show();
    16. cout<<endl;
    17. cout<<"fixing time=";
    18. fixing.Show();
    19. cout<<endl;
    20. total=coding.Sum(fixing);
    21. cout<<"coding.Sum(fixing)=";
    22. total.Show();
    23. cout<<endl;
    24. return 0;

    image.png