以上图片来自RUNOOB.COM
下面的运算符只能通过成员函数进行重载
=:赋值运算符
():函数调用运算符
[]:下标运算符
->:通过指针访问变量的运算符
重载的运算符的限制和规则:
1.重载后的运算符必须至少有一个操作数是用户自己定义的类型,这将防止用户为标准类型重载运算符。
2.使用运算符时不能违反运算符原来的语法规则,例如,不能将求模运算符(%)重载成使用一个操作数。
3.不能改变运算符的优先级。
4.不能改变运算符的结合性也不能创建新的运算符。
对于单目运算符,其一般没有参数,使用规则和标准的使用方法一致,比如:
T& operator*()const{return node->element;}
对于双目运算符,这时就要注意左操作数和右操作数了,其一般有一个参数,为右操作符,调用的类为左操作符,比如:
bool operator!=(const iterator right)const
{return node!=right.node;}
其他类型的运算符的操作方法可以归并到单目与双目运算符的重载里面,我就不多说了。
下面是几类特殊的运算符:
1.自增自减运算符
这个有先加加和后加加之分,先加加用operator++()格式进行重载,后++用operator++(int)进行重载。这个int没用就是个标识符而已。
2.->指针运算符的重载
这个运算符只能通过类成员函数进行重载,关键是他是个双目运算符,但是却不显示的定义参数即右操作数,比如:
T* operator->()const {return &node->element;}
假如该函数属于类K
则K->element相当于K.operator->()->element.也就是先调用我们重写的那个函数获取了element的地址,在利用element的地址和默认->运算符调用element。这是个递归调用的过程。
详细原理可以参考这位大侠的博客:https://blog.csdn.net/custa/article/details/5674434
暂时写这么多,等发现其他特殊的重载再来补充。
其他重载符号例子点这里:https://blog.csdn.net/Du_Shuang/article/details/81117296