什么是操作符重载?为何要操作符重载?
所谓的操作符重载,是指我们把一些基本的运算符,定义出新的方法和功能,它所针对的,是我们新定义的类类型。那么,为什么要操作符重载呢,这是因为我们自定义的类型并不是默认的基本类型,当我们对它们进行运算符操作时,编译器并不能理解我们要干什么,所以就需要我们亲手为新类型定义一些实现方法。操作符重载的本质,实际上就是类成员函数的调用。
操作符重载的规则及注意事项
首先,操作符的结合性与优先级不可以被改变。
其次,以下几个操作符不可以重载,它们分别是指针运算符、成员运算符、作用域运算符【::】、sizeof运算符和条件运算符【?:】。
操作符重载的实现方法
操作符重载分为两种形式,成员函数重载和友元函数重载。本博重点分析前者,后者的话除了形式上的小不同之外,其它都可以同理类推【实际是因为本人跟友元不熟】。
而可以重在的操作符,大致又分为两类:二元操作符和一元操作符。我们先从二元操作符开始,比如,介绍一下如何重载“+”运算符:
#include <iostream>
#include <string>
using namespace std;
class I
{
public:
I(int a1) { a = a1; }
I operator +(I c) //这个就是操作符重载函数
{
I temp(0);
temp.a = a - c.a;
return temp;
}
int a;
};
int main()
{
I i(10),j(3),k(0);
k = i + j; /*这一句,实际上就相当于调用了I的成员函数operator+(&i,j)*/
cout << k.a << endl;
system("pause");
return 0;
}
把上面的代码编译运行一下,相信最后的输出结果是7而不是13,为什么?请注意代码中的操作符重载函数的定义,虽然我们使用的是+操作符,但实际里面执行的是减法操作,我之所以挂羊头卖狗肉,也是为了证明一下操作符函数的实现方法是比较自由的。
介绍完了二元操作符,接下来说说一元操作符。在上面的+号例子中,相信大家都可以举一反三了,所以在一元操作符的介绍中,我们就拿一个比较特殊的操作符来开刀吧,它就是++操作符:
那么++类型的一元符有什么特殊呢?请看代码中的注释1和注释2,前者代表声明了一个后置++操作符函数,后者代表了声明了一个前置++操作符函数。二者除了“&”符的不同外,还有一个参数表中有误【int】的不同,那么在后置++函数中,为什么要加那个int呢?其实,这个int并没有什么具体的意义,之所以加上它,纯粹是一个标识符,用于区分出++是前置还是后置,有就是后置,没有就是前置。
最后,再提特殊的例子:【<<】运算符,请看图片:
那么,这个【<<】特殊在哪里呢?首先,【<<】操作符重载必须得用友元形式,这是因为成员操作符函数会隐藏第一个参数,而且那个隐藏的默认参数一定是this的引用类型。而【<<】的操作符函数中,第一个参数必须得是&ostream类型,两者明显不符,所以成员函数无法声明定义【<<】操作符的重载。其次,【<<】操作符函数的返回类型必须得是ostream类型,这点也要切记。