如果您希望Time
对象与整数相乘可以有两种顺序(即Time * int
和int * Time
),您需要重载operator*
两次:一次作为Time
类的成员函数,一次作为非成员函数。下面是如何实现这两个重载的例子:
#include <iostream>
class Time {
private:
int hours;
int minutes;
public:
Time() : hours(0), minutes(0) {}
~Time() {}
void AddMin(int m) {
minutes += m;
hours += minutes / 60;
minutes %= 60;
}
void AddHour(int h) {
hours += h;
}
void Reset(int h = 0, int m = 0) {
hours = h;
minutes = m;
}
// 重载 Time * int
Time operator * (int scalar) const {
Time result;
result.minutes = minutes * scalar;
result.hours = hours * scalar + result.minutes / 60;
result.minutes %= 60;
return result;
}
friend Time operator * (int scalar, const Time& t); // 声明 int * Time 的友元函数
void Show() const {
std::cout << hours << " hours, " << minutes << " minutes" << std::endl;
}
};
// 定义 int * Time 的重载
Time operator * (int scalar, const Time& t) {
Time result;
result.minutes = t.minutes * scalar;
result.hours = t.hours * scalar + result.minutes / 60;
result.minutes %= 60;
return result;
}
int main() {
Time t1;
t1.Reset(2, 30); // 设置 t1 为 2 小时 30 分钟
int scalar = 3;
Time t2 = t1 * scalar; // 将 t1 的时间乘以 3
Time t3 = scalar * t1; // 将 t1 的时间乘以 3
t2.Show(); // 应该显示 7 小时 30 分钟
t3.Show(); // 应该显示 7 小时 30 分钟
return 0;
}
在这个例子中,我们首先在Time
类内部重载了operator*
作为成员函数,用于处理Time * int
的情况。然后,我们声明了一个友元函数operator*
,用于处理int * Time
的情况,并在类外部定义了这个友元函数。
这样,无论是Time * int
还是int * Time
,都可以正常工作,并且会调用相应的operator*
重载函数。在main
函数中,我们演示了两种用法,都能得到相同的结果。