C++语言中预定义的运算符的操作对象只能是基本数据类型,但是,在实际应用中,对于很多用户自定义数据类型(如类)也需要类似的功能,这就需要对已有的运算符赋予多种含义,使同一个运算符具有作用于不同类性的数据导致不同类型的行为,这就是运算符重载。因此,运算符重载的目的是设置C++语言中的某一运算符,让它们之间并不冲突,C++语言会根据运算符的位置辨别应使用哪一种功能进行运算。可见,运算符重载的优点是允许改变使用于系统内部的运算符的操作方式,以适应用户新定义类型的类似运算。
运算符重载的实质是函数重载。事实上,C++语言中的每一个运算符对应着一个运算符函数,在实现过程中,把指定的运算表达式中的运算符转化为对运算符函数的调用,而表达式中的运算对象转化为运算符函数的实参,这个过程是在编译阶段完成的。例如:
int a=1,b=2;
a+b;
表达式“a+b”在编译前,将被解释为函数调用形式:operator+(a,b)。
其中,operator是一个关键字,它与后面的“+”共同组成了该运算符函数的函数名。
运算符重载是一种特殊的函数重载。在类中可以采用下述两种方法对运算符函数进行重载。
1.重载为类的成员函数
将运算符函数重载为类的成员函数是指在类中定义一个同名的运算符函数,其语句格式为:
TYPE X::operator@(形参表)
{
//函数体
//重新定义运算符@在指定类X中的功能
}
其中,operator是关键字,@是需要被重载的运算符,X是需要重载该运算符的类名,TYPE是该运算符函数的返回值类型。关键字operator与后面的运算符@共同组成了该运算符函数的函数名。
2.重载为类的友元函数
可以定义一个与某一运算符函数同名的全局函数,然后再将该全局函数声明为类的友元函数,从而实现运算符的重载。其语法格式为:
friend TYPE operator@(形参表);
下面介绍运算符重载的几个问题:
l 以上两种重载形式均可访问类的私有成员;
l 几乎所有的运算符都可以被重载,但下列运算符不允许重载:
“。”、“。*”、“::”、“?:”
l 运算符重载后,既不会改变原运算符的优先级和结合特性也不会改变使用运算符的语法和参数个数;
l “=”、“()”、“[]”和“->”等运算符不能重载为友元函数;
l 当运算符重载为类的成员函数时,函数的参数个数比原来的运算对象少一个(右++和右——除外);当重载为类的友元函数时,参数个数与原运算符的运算个数相同;单目运算符最好重载为类的成员函数,而双目运算符则最好重载为类的友元函数。