题目的主要信息:

  • 有一个时间类(Time),成员变量有:小时(hours)、分钟(minutes),补充 Time 类的代码,重载加号运算符,使得程序能够正确运行

具体做法:

类因为一般包含了多个成员变量,甚至包含了不同类型的成员变量,一般的运算符都不能再用了,只能通过重载的方式使用,比如加法运算,编译器不知道该怎么加,是只加小时还是只加分钟,还是全部加起来,而如果换一个类又该怎么加。于是C++提供了符号重载,通过自己写一个函数来表示这个符号该怎么运算。

运算符一般包含单目运算符、双目运算符合三目运算符,因此重载的函数一般形容"opertator运算符",返回的东西一般就是这个类的变量实例,这个很好理解,我1+1返回的肯定也是整型int(比较判断类符号除外)。然后是函数的参数,单目运算符就操作这个类本身,无参数,双目运算符操作这个类和另一个实例,三目以此类推。

因此本题要重载的加法运算符,返回值是这个类及Time,参数只有一个,于是写作Time operator+(Time& p),这个p就是传入的要和这个类的元素相加的实例。我们依照时间的加法,将二者的小时数相加,分钟数相加的超过60的部分(整数除法)再加到小时里去,然后分钟数相加的余数加到分钟数,最后返回Time实例的和就行了。 alt

#include <iostream>
using namespace std;

class Time {
    public:

        int hours;      // 小时
        int minutes;    // 分钟

        Time(){  //初始化
            hours = 0;
            minutes = 0;
        }

        Time(int h, int m) { //构造函数
            this->hours = h;
            this->minutes = m;
        }

        void show() {
            cout << hours << " " << minutes << endl;
        }

        // write your code here......
        Time operator+(Time& t){
            Time sum;
            sum.hours = hours + t.hours + (minutes + t.minutes) / 60;  //小时数相加,加上分钟数多余60进1
            sum.minutes = (minutes + t.minutes) % 60; //分钟数要对60取余
            return sum; //返回为一个Time类型
        }
};

int main() {

    int h, m;
    cin >> h;
    cin >> m;

    Time t1(h, m);
    Time t2(2, 20);

    Time t3 = t1 + t2;
    t3.show();
    
    return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),直接计算,常数时间
  • 空间复杂度:O(1)O(1),无额外空间