一、运算符的重载:
根据自己的需要对C++已提供的运算符进行重载,赋予它们新的含义,使之一名多用。
例:定义一个专门的函数来实现复数相加。
通过函数来用“+”号实现复数的相加:
#include<iostream>
using namespace std;
class Complex
{
public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
Complex complex_add(Complex &c2);
void display();
private:
double real;//定义实部
double imag;//定义虚部
};
Complex Complelx::complex_add(Complex &c2)
{
Complex c;
c.real=real+c2.real;
c.imag=imag+c2.imag;
return c;
}
void Complex::display()
{
cout<<"("<<real<<","<<imag<<"i)"<<endl;
}
int main()
{
Complex c1(3,4),c2(5,-10),c3;
c3=c1.complex_add(c2);//调用复数相加函数
cout<<"c1="<<;c1.display();
cout<<"c2="<<;c2.display();
cout<<"c1+c2=";c3.display();
return 0;
}
其中要两个复数相加需要用到复数相加函数。
下面可以用重载运算符的方法来定义。
概念:
运算符重载的方法是定义一个重载运算符的函数,使指定的运算符不仅能实现原有的功能,而且能实现在函数中指定的新的功能。
运算符重载实质上是函数的重载。
重载运算符的函数一般格式:
函数类型 operator+ 运算符名称 (形参表)
{对运算符的重载处理}
则需要把上面的部分代码做出修改即可:
Complex Complex::operator+(complex &2)//定义重载运算符
{
Complex c;
c.real=real+c2.real;
c.imag=imag+c2.real;
return c;
}
int main()
{
c3=c1+c2;//运算符“+”用于复数运算
}
二、重载运算符的规则
1、c++不允许用户定义新的运算符,只能对已有的C++运算符进行重载。
双目算数运算符 | +,-,*,/(除),%(取模) |
关系运算符 | ==(等于),!=(不等于),<,>, <=,>= |
逻辑运算符 | ||(逻辑或),&&(逻辑与),!(逻辑非) |
单目运算符 | +(正),-(负),*(指针),&(取地址) |
自增自减运算符 | ++(自增),--(自减) |
位运算符 | |(按位或),&(按位与),~(按位取反),^(按位异或),<<(左移),>>(右移) |
赋值运算符 | =,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>= |
空间申请与释放 | new,delete,new[],delete[] |
其他运算符 | ()(函数调用),->(成员访问),->*(成员指针访问),,(逗号),[](下标) |
不能重载的运算符只有五个:
* | 成员指针访问运算符 |
:: | 域运算符 |
sizeof | 长度运算符 |
?: | 条件运算符 |
. | 成员访问运算符 |
注意:
重载后的运算符不能改变运算符的基本性质。
重载运算符必须和对象定义的自定义类型对象一起使用,其参数至少应有一个是类对象(或类对象的引用).
对于类对象的运算符一般必须重载,但有两个例外,运算符"="和“&”不必用户重载。