知识点1.写重载函数前要考虑的几点
1.不能重载的5个运算符:. , :: , * , ? :, sizeof
2.对于运算符 = ,() , [] , -> 只能作为成员函数,不能重载为友元函数
3.<<(输出运算符) 和 >>(输入运算符) 只能重载为友元函数,不能重载为成员函数
4.对于单目运算符,建议选择成员函数;双目运算符,最好重载为友元函数
5.对于运算符“+ =,-=,/=,*=,&=,!=,~=,%=,<<=,>>=”建议重载为成员函数
6.对于其他运算符,建议重载为友元函数
7.双目运算符一般可以重载为友元运算符函数或成员运算符函数,但当两个操作数的类型不一致时,必须使用友元函数
知识点2.重载运算符的限制
重载运算符函数可以对运算符做出新的解释,但是:
1.运算符的优先级重载前后不变
2.运算符的结合性重载前后不变
3.运算符的操作数重载前后不变
4.不能创造出新的运算符
知识点3.需要注意的点
1.大部分运算符函数可以重载为成员函数和友元函数
2.区别:成员函数有this指针,友元函数没有this指针
3.不管是成员函数重载,还是友元函数重载,重载后的运算符使用方法相同
知识点4.重载运算符函数的类型
1.成员运算符函数:把运算符函数定义成某个类的成员函数
2.友元运算符函数:把运算符函数定义成某个类的友元函数
知识点5.运算符函数调用的方式(aa和bb都是同一个类中的对象)
1.aa 运算符 bb;//成员或友元都可以这样调用,
## 但是这样使用的前提是运算符函数的类型是该类的类名,不能是void,int之类的类型
e.g
int main()
{
Complex c1(3,4);
Complex c2(5,-10);
Complex c3;
c3=c1+c2;
cout<<"c1=";
c1.display();
cout<<"c2=";
c2.display();
cout<<"c1+c2=";
c3.display();
return 0;
}
2.aa.operator 运算符(bb);//只有成员函数可以这样调用此调用为双目,单目:aa.operator 运算符();
e.g
int main()
{
Complex c1(3,4);
Complex c2(5,-10);
Complex c3;
c3=c1.operator +(c2);
cout<<"c1=";
c1.display();
cout<<"c2=";
c2.display();
cout<<"c1+c2=";
c3.display();
return 0;
}
或以下形式(推荐)
#include<iostream>
using namespace std;
class Complex{
private:
double real;
double imag;
public:
Complex(){
real=0;imag=0;}
Complex(double ,double);
Complex operator +(Complex );
void display();
};
Complex::Complex(double r,double i)
{
real=r;
imag=i;
}
Complex Complex::operator +(Complex c2)
{
return Complex(real+c2.real,imag+c2.imag);
}
void Complex::display()
{
cout<<"("<<real<<","<<imag<<"i)"<<endl;
}
int main()
{
Complex c1(3,4);
Complex c2(5,-10);
Complex c3;
c3=c1+c2;//或者写成c3=c1.operator +(c2);
cout<<"c1=";
c1.display();
cout<<"c2=";
c2.display();
cout<<