运算符成员函数设计
(1)前置运算符op
如果要重载op为类成员函数,使之能够实现表达式op oprd,其中oprd为类A的对象,则op应被重载为A类的成员函数,无形参。经重载后,表达式op oprd相当于oprd.operator op()。
增1减1运算符是一元运算符,它们又有前置和后置两种。为了区分这两种运算,将后置运算视为二元运算符。表达式:
obj++或obj–,被看作obj++0或obj–0
(2)后置一元运算符++、–
如果要重载++、–为类成员函数,使之能够实现表达式oprd++、oprd–,其中oprd为A类对象,则++或–应被重载为A类的成员函数,且具有一个int类型的形参。经重载后,表达式oprd++相当于 oprd.operator++(0)。
例 运算符前置++和后置++重载为时钟类的成员函数。
前置一元运算符,重载函数没有形参。
后置一元运算符,重载函数需要一个整形的形参。
操作数是时钟类对象。
实现时间增加一秒钟。
#include <iostream>
using namespace std;
class Clock{
public:
Clock(int Hour=0,int Minute=0,int Second=0){
this->Hour=Hour;
this->Minute=Minute;
this->Second=Second;}
void showtime(){
cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}
Clock & operator ++ ();
Clock operator ++(int);
private:
int Hour,Minute,Second;
};
Clock & Clock::operator ++ (){
Second++;
if(Second>=60){
Second=Second-60;
Minute++;
if(Minute>=60){
Minute=Minute-60;
Hour++;
Hour%=24;}
}
return *this;
};
Clock Clock::operator ++(int){
Clock old=*this;
++(*this);
return old;
};
int main()
{
Clock myClock(23,59,59);
cout<<"First time output:";
myClock.showtime();
cout<<"Show myClock++:";
(myClock++).showtime();
cout<<"Show ++myCLock:";
(++myClock).showtime();
return 0;
}
在C++原生语言中,前置运算符返回的是对象的引用,后置运算符不返回引用,为了维持这种一致性,在重载前置运算符时函数返回值最好也是引用因此,前置可以作为左值,而后置不可++a = 1合法, a++ = 1不合法。由于前置返回的是引用,所以前置运算符较后置运算符快。(没有一些中间对象的构造和析构的过程),所以若前置后置对程序正确性没有影响的情况下应该使用前置运算符。