运算符重载函数相当于类来说有两种存在方式:
1.重载为类的成员函数。
2.重载为类的友元函数。
重载为类的成员函数。
如果把运算符重载为类的成员函数,则该函数么须通过对象调用,该对象就是运算符的其中一个操作数,在运算符重载函数中通过this指针隐含(或显式)地访问对象的成员。
如果把双目运算符重载为类的成员函数,则该运算符有两个操作数,左操作数是调用运复符重载函数的对象,而右操作数作为运算符重载函数的实参传递到运算符重载函数中双目运算符重载为类的成员函数时,其调用的一般格式如下:
**左操作数 运算符 右操作数;**
编译器把它解释为
**左操作数.operator 运算符(右操作数);**
即左操作数是调用运算符重载函数的对象,右操作数作为函数的参数。
例如,表达式“sl>=s2”相当于“s1. operator>=(s2)”
如果把单目运算符重载为类的成员函数,则该运算符只有一个操作数,即调用运算符重载函数的对象本身。单目运算符重载为类的成员函数时,要区分前置运算符与后置运算符
如果是前置运算符,则运算符重载函数没有参数。其调用格式如下:
**运算符 操作数;**
编辑器把它解释为
**操作数.operator 运算符();**
注意:
如果是后置运算符,运算符重载函数需要一个整型参数,*但该参数不起任何作用,仅用来标识该运算符是后置运算符。*其调用格式如下:
操作数 运算符;
编译器把它解释为
操作数 operator 运算符 (int)
下面通过一个示例,演示重载自增运算符的方法,实现自定义Time类对象 t的自增运算运算规则则是把当前对象t的秒数加一。
#include<iostream>
using namespace std;
class Time
{
public:
Time(int h = 0, int m = 0, int s = 0)
{
hour = h;
minute = m;
second = s;
}
Time operator++ ();
Time operator++ (int);
void show();
private:
int hour;
int minute;
int second;
};
Time Time::operator++()//实现前置自增
{
second++;
if (second == 60)
{
minute++;
second = 0;
}
if (minute == 60)
{
hour++;
minute = 0;
}
hour %= 24;
return *this;
Time Time::operator++(int)//实现后置自增
{
Time t = *this;
++(*this);
return t;
}
void Time::show()
{
cout << hour << ":" << minute << ":" << second << endl;
}
int main()
{
Time t;
t.show();
Time t1;
t1 = t++;
t1.show();
t.show();
t1 = ++t;
t1.show();
t.show();
return 0;
}
}
本例实现前置自增及后置自增运算,前置自增函数不带参数,后置自增函数带一个int类型的参数,这里的int仅用于区别前置自增,在函数调用时不带参数。本程序值得读者借鉴的地方是在实现后置自增时直接调用了已经实现的前置
自增运算符。从结果来看,后置自增运算表式保留了对象自增之前的值,并且对象实现了自增;前置自增运算实现了对象的自增,并且表达式的值是对象自增之后的值。这与算术运算中自增运算符的功能是吻合的。
重载为类的友元函数。
运算符重载函数可以实现为类的成员函数,也可以实现为类的友元函数。运算符的左操作数如果不是当前类的对象,那么该运算符就不能声明为类的成员函数只能声明为类的友元函数。在类中对运算符重载函数进行友元函数的声明格式如下:
friend 类型说明符 operator 运算符 (参数列表);
类的友元函数不能通过对象进行调用,所以运算符的操作数全部作为运算符重载函数
的实参传递到运算符重载函数中。双目运算符重载函数重载为类的友元函数时的调用格式
如下:
做操作数 运算符 右操作数;
编译器把它解释为
operator 运算符 (左操作数,右操作数);