操作符重载-如何可以交换乘法顺序-友元函数

如果您希望Time对象与整数相乘可以有两种顺序(即Time * intint * 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函数中,我们演示了两种用法,都能得到相同的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九层指针

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值