在C++中,当运算符被用于类类型的对象时,它允许我们为其指定新的含义。通过重载的方式,能使表达更加简洁明了。
下面通过一个例子来总结运算符的重载问题:
#include <iostream>#include <typeinfo>#include <string>using namespace std;struct plural //定义一个复数的结构体。 { int rel = 0; int img = 0; }; ostream &operator <<(ostream &os, plural &p)//重载输出运算符{ os << p.rel << "+j" << p.img << endl; return os; } plural operator +(plural &p1, plural &p2)//重载加法运算符{ plural p3; p3.rel = p1.rel + p2.rel; p3.img = p1.img + p2.img; return p3; }int main(){ plural p1, p2; p1.rel = 1, p1.img = 2; p2.rel = 2, p2.img = 5; cout << p1 + p2 << endl; system("pause"); return 0; } 输出: 3+j7
在以上代码中可以看到,先通过定义一个复数的结构体,确定了其虚部和实部。然后通过对“<<”和“+”运算符的重载来实现复数的输出和加法。
函数类型 operator 运算符(形参表) { 函数体 }
重载的基本模板。
在重载的同时还需知道几条基本的原则:
1.不能改变运算符的初始意义。
2.不能改变运算符的参数数目。如重载运算符+时只用一个操作数是错误的。
3.运算符函数不能包括缺省的参数。
4.绝大部分C++运算符都可以重载,除以下的例外:
::
,.*
, .
,?:
5.除赋值运算符外,其它运算符函数都可以由派生类继承。
6.运算符重载不改变运算符的优先级和结合性,也不改变运算符的语法结构,即单目、双目运算符只能重载为单目、双目运算符。
7.运算符的重载实际上是函数的重载。编译程序对运算符重载的选择,遵循函数重载的选择原则。当遇到不很明显的运算符时,编译程序将去寻找参数匹配的运算符函数。
8.运算符重载可使程序更简洁,使表达式更直观,增强可读性。但使用不宜过多。
作者:Wayne_Dream
链接:https://www.jianshu.com/p/81d2aadcc18c