多态性类的友元重载相关注意点

时间:2021-06-02 09:17:15

我将发几种情况进行对比,希望能对你们有所帮助

#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;其实这个和上面的区别可以运用显式调用进行理解的

 补充说明:以类成员重载运算符时需要的运算符参数比实际少一个,而友元类型则个数相同。