我将发几种情况进行对比,希望能对你们有所帮助
#include<iostream>
using namespace std;
class complex
{
private:
int i,r;
public:
complex(int a=0,int b=0):r(a),i(b){};
complex operator+(complex b);
void printf()
{
cout<<r<<"+"<<i<<"i"<<endl;
}
};
complex complex::operator+(complex b)
{
return complex(r+b.r,i+b.i);
}
int main()
{
complex b1(3,3),b3;
b3=b1+4//正确
//b3=4+b1 错误
b3.printf();
return 0;
}
因为当将coperator+重载为complex类的成员函数时,第二种不能进行隐式类型转换,第一种可以转换为b3=b1(3,3)+complex(4,0),而第二总不能把4隐式类型转化为一个对象。也就是说operator+重载为complex类的成员函数第一个参数一定得是一个对象。但若是coperator+重载为complex类的友元函数或普通函数时,情况则又不同了
#include<iostream>
using namespace std;
class complex
{
private:
int i,r;
public:
complex(int a=0,int b=0):r(a),i(b){};
friend complex operator+(complex a,complex b);
void printf()
{
cout<<r<<"+"<<i<<"i"<<endl;
}
};
complex operator+(complex a,complex b)
{
return complex(a.r+b.r,a.i+b.i);
}
int main()
{
complex b1(3,3),b3;
b3=b1+4;//正确
b3.printf();
b3=4+b1;
b3.printf();
return 0;
}
你将会发现两者输出的结果都是一样的,这就和上面的不一样了,因为这两个都是可以进行隐式类型转换如第二个可以转换为b3=complex(4,0)+b1;其实这个和上面的区别可以运用显式调用进行理解的
补充说明:以类成员重载运算符时需要的运算符参数比实际少一个,而友元类型则个数相同。