#include <iostream>
class Mytime
{
private:
int hours;
int minutes;
public:
Mytime(int h = 0, int m = 0):hours(h),minutes(m){}
Mytime(const Mytime &other):hours(other.hours), minutes(other.minutes){}
void addMin(int m)
{
minutes += m;
hours += minutes / 60;
minutes %= 60;
}
void addHr(int h)
{
hours += h;
}
void reset(int h, int m)
{
hours = h;
minutes = m;
}
Mytime operator+(const Mytime &other) const
{
Mytime sum;
sum.minutes = other.minutes + minutes;
sum.hours = other.hours + hours + sum.minutes / 60;
sum.minutes %= 60;
return sum;
}
Mytime operator-(const Mytime &other) const
{
Mytime diff;
int total_1, total_2;
total_1 = hours * 60 + minutes;
total_2 = other.hours * 60 + other.minutes;
diff.hours = (total_1 - total_2) / 60;
diff.minutes = (total_1 - total_2) % 60;
return diff;
}
Mytime operator*(double mult) const
{
Mytime result;
long total_min = static_cast<long>(static_cast<double>(hours) * mult * 60.00 + static_cast<double>(minutes) * mult);
result.hours = total_min / 60;
result.minutes = total_min % 60;
return result;
}
friend std::ostream & operator<<(std::ostream &c, Mytime &other)
{
return c << "time: " << other.hours << ":" << other.minutes;
}
};
int main()
{
Mytime time(11,22);
Mytime time2(10,21);
time2 = time2 - time;
std::cout << time2 << std::endl;
system("pause");
return 1;
}
这个例子主要是对 重载运算符的练习,
<C++PL> 11.2.1 二元和一元运算符 这一节值得看.
<C++PL> 11.5.2 友元和成员 这一节也值得看
貌似如果类有一个参数的构造函数, 并且非 explicit 的, 如 Mytime(int i), 那么如 +, - , * 等算术操作符一般定义为非成员函数, 因为操作对象能进行隐式类型转换,
如Mytime operator+(const Mytime &lhs, const Mytime &rhs) ,
有操作如: i + time1 将被隐式转换为 Mytime(i) + time1
就不用重载Mytime operator+(int i, const Mytime &rhs) 了, 但是隐式转换有好处也有坏处. 可能 i + time1 是写错了的, 但是编译却通过了, 然后你又没发现, 以后找错误就麻烦了.