所谓运算符重载其实就是对于运算符针对不同操作对象而实现不同功能,其实质就是函数重载(函数重载前面有一篇介绍)。实现过程就是先把运算表达式转化为对运算符函数的调用,把运算对象转化为运算函数的实参,然后根据实参的类型确定需要调用的函数。另外,c++标准规定了一些不能重载的操作符,分别是:1.类属关系运算符“ . ”,2.成员指针运算符“ . * ”,3.作用域分辨符“ :: ”,4.三目运算符“ ?: ”。
运算符重载形式有两种,要么重载为类的非静态成员函数,要么重载为非成员函数。
一般重载的语法格式为:
返回类型 operator 运算符(形参){函数体}
下面举个重载为类的非静态成员函数的例子:
首先建一个简单的时间类:
class Time
{
private:
int hour;
int minute;
int second;
public:
Time();
Time(int _hour);
Time(int _hour,int _minute,int _second);
Time operator+(Time &t);//重载“+”
Time operator++ (int);//重载后置“++”
Time& operator++ ();//重载前置“++”
void Print();
void setHour(int h )
{
int hour=h;
}
void setMinute(int m)
{
minute=m;
}
void setSecond(int s)
{
second=s;
}
int getHour()
{
return hour;
}
int getMinute()
{
return minute;
}
int getSecond()
{
return second;
}
};
先看一下主函数:
int main()
{
int x,y,z,p;
cin>>x>>y>>z>>p;
Time t1(x,y,z),t2(p),t3;
cout<<"t1+t2: ";
t3=t1+t2;
t3.Print();
t2=++t3;
t2.Print();
t2=t3++;
t2.Print();
t3.Print();
return 0;
}
主函数里要实现两个对象相加还有单个对象的前置++和后置++运算
看一下三个运算符号重载函数的实现;
Time Time::operator +(Time &t)
{
return Time(hour+=t.getHour(),minute+=t.getMinute(),second+=t.getSecond());
}
这里返回值是Time类的对象,至于形参表只有一个对象是因为重载为类的成员函数时,第一个操作数会被作为函数调用的目的对象,无需出现在参数表里,函数体中可以直接访问第一个操作数的成员,而如果重载为非成员函数时,则运算符的所有操作数都进行显示地参数传递。
下面是前置++和后置++的语法格式和本程序的相关实现:
//前置++
Time & Time::operator ++()
{
second++;
if(second>=60)
{
second-=60;
minute+=1;
if(minute>=60)
{
minute-=60;
hour=(hour+1)%12;
}
}
return *this;
}
//后置++
Time Time::operator ++(int)
{
Time t = * this;
++(* this);
return t;
}