概念:运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 目的:增加代码的可读性 函数名字:关键字operator后面接需要重载的运算符符号 函数原型:返回值类型+operator操作符号+(参数列表)----(例如:==运算符重载为bool operator ==(参数列表) 下面我们用一个简单的Time类进行各种演示:
class Time{ public: Time(int hour=12,int minute=13,int second=12){ _hour = hour; _minute = minute; _second = second; } private: int _hour; int _minute; int _second; };1.Time对象之间大小的比较
//<运算符重载 bool operator<(const Time& d){ return (_hour < d._hour) || (_hour == d._hour&&_minute < d._minute) || (_hour == d._hour&&_minute == d._minute&&_second < d._second); } //==运算符重载 bool operator==(const Time& d){ return _hour == d._hour&&_minute == d._minute&&_second == d._second; } //>运算符重载 bool operator>(const Time& d){ return !(*this < d || *this == d); } //<=运算符重载 bool operator<=(const Time& d){ return (*this < d || *this == d); } //>=运算符重载 bool operator>=(const Time& d){ return (*this>d || *this == d); } //!=运算符重载 bool operator!=(const Time& d){ return !(*this == d); }这里我们只需要实现两个比较运算符(例如>和==)就可以利用这两个去简单的实现其他的比较运算符 2.Time对象之间的加减换算
Time operator+(Time& d){ Time tmp(*this); tmp._hour = _hour + d._hour; tmp._minute = _minute + d._minute; tmp._second = _second + d._second; if (tmp._second > 60){ tmp._second = tmp._second - 60; tmp._minute = tmp._minute + 1; if (tmp._minute > 60){ tmp._minute = tmp._minute - 60; tmp._hour = tmp._hour + 1; if (tmp._hour > 24){ cout << "hour不能大于24" << endl; } } } return tmp; } Time operator-(Time& d){ Time tmp(*this); tmp._hour = _hour - d._hour; tmp._minute = _minute - d._minute; tmp._second = _second - d._second; if (tmp._minute < 0){ tmp._hour = tmp._hour - 1; tmp._minute = tmp._minute + 60; } if (tmp._second < 0){ tmp._minute = tmp._minute - 1; tmp._second = tmp._second + 60; } return tmp; }这里我考虑到时间相加,也会有"进位"或者"借位",所以也运用了判断语句,读者也可以全方位考虑,更加精确的时间的相加减。 3.时间±秒数
//时间+=秒 Time& operator+=(int second){ _second = _second + second; return *this; } // Time& operator-=(int second){ _second = _second - second; return *this; } Time operator+(int second){ Time tmp(*this); tmp._second += second; if (tmp._second > 60){ tmp._second = tmp._second - 60; tmp._minute = tmp._minute + 1; if (tmp._minute > 60){ tmp._minute = tmp._minute - 60; tmp._hour = tmp._hour + 1; if (tmp._hour > 24){ cout << "hour不能大于24" << endl; } } } return tmp; } Time operator-(int second){ Time tmp(*this); tmp._second -= second; if (tmp._minute < 0){ tmp._hour = tmp._hour - 1; tmp._minute = tmp._minute + 60; } if (tmp._second < 0){ tmp._minute = tmp._minute - 1; tmp._second = tmp._second + 60; } return tmp; }对于对象的加减,无论是加整数,还是加一个相同类型的对象,都需要考虑,自身是否发生了改变,如果发生改变,则违反了+或者-运算符的意思,所以我们在实现运算符重载函数的同时,考虑运算符的含义不能被改变。 4.对象的自增自减
//前置++ Time& operator++(){ *this = *this + 1; return *this; } //后置++ Time operator++(int){ Time tmp(*this); *this = *this + 1; return tmp; } //前置-- Time& operator--(){ *this = *this - 1; return *this; } //后置-- Time operator--(int){ Time tmp(*this); *this = *this - 1; return tmp; }关于前置和后置的区别,我们需要主义,后置是先赋值,在自增或者自减少,所以需要我们创建一个临时对象,去保存当前值,然后返回,而对于前置与后置运算符的区别就在于是否有int。 5.两个时间之间相差的秒数
//时间-时间=秒数 int operator-(const Time& d){ int i = 0; Time a(*this); Time b(d); if (*this > d){ while (a != b){ i++; b++; } } else{ while (a != b){ i++; a++; } } return i; }关于,时间之间相减,我们在前面已经实现,也考虑了借位,所以这里我们只需要利用计数器,去统计相差的秒数。 关于运算符重载的相关运算符实现就谈到这里!!
