在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.运算符重载可使程序更简洁,使表达式更直观,增强可读性。但使用不宜过多。