题目的主要信息:
- 有一个时间类(Time),成员变量有:小时(hours)、分钟(minutes),补充 Time 类的代码,重载加号运算符,使得程序能够正确运行
具体做法:
类因为一般包含了多个成员变量,甚至包含了不同类型的成员变量,一般的运算符都不能再用了,只能通过重载的方式使用,比如加法运算,编译器不知道该怎么加,是只加小时还是只加分钟,还是全部加起来,而如果换一个类又该怎么加。于是C++提供了符号重载,通过自己写一个函数来表示这个符号该怎么运算。
运算符一般包含单目运算符、双目运算符合三目运算符,因此重载的函数一般形容"opertator运算符",返回的东西一般就是这个类的变量实例,这个很好理解,我1+1返回的肯定也是整型int(比较判断类符号除外)。然后是函数的参数,单目运算符就操作这个类本身,无参数,双目运算符操作这个类和另一个实例,三目以此类推。
因此本题要重载的加法运算符,返回值是这个类及Time,参数只有一个,于是写作Time operator+(Time& p)
,这个p就是传入的要和这个类的元素相加的实例。我们依照时间的加法,将二者的小时数相加,分钟数相加的超过60的部分(整数除法)再加到小时里去,然后分钟数相加的余数加到分钟数,最后返回Time实例的和就行了。
#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;
}
复杂度分析:
- 时间复杂度:,直接计算,常数时间
- 空间复杂度:,无额外空间