C++——友元函数重载运算符时形参的顺序

当 2 个对象相加时是没有顺序要求的,但要重载 + 让其与一个数字相加则有顺序要求,可以通过加一个友元函数使另一个顺序的输入合法。

class A
{

……

                A operator+(const A & obj);
            A operator+(const int b);
    friend A operator+(const int b, A obj);
            ……

} ;

 

 

    A a1(1);
    A a2(2);
    A a3,a4;
    int m=1;
    a3=a1+a2;//可以交换顺序,相当月a3=a1.operator+(a2);
    a3.display();
    a4=a1+m;//因为加了个友元函数所以也可以交换顺序了。

 

来自

 

 

 

总结:

C++允许对运算符进行重载,一般为operator op();当运算符函数为成员,则对象为第一操作数。

当运算符函数为友元函数时,则第一个形参为第一操作数

eg:

如果运算符左侧的操作数属于C++标准类型(如int)或是一个其他类的对象,则运算符重载函数不能作为成员函数,只能作为非成员函数。如果函数需要访问类的私有成员,则必须声明为友元函数。

<<运算符的重定义需要让ostream对象成为第一个操作数,因此<<运算符函数的重载必须定义为友元函数

 

 

 

将双目运算符重载为友元函数时,在函数的形参表列中必须有两个参数,不能省略,形参的顺序任意,不要求第一个参数必须为类对象。但在使用运算符的表达式中,要求运算符左侧的操作数与函数第一个参数对应,运算符右侧的操作数与函数的第二个参数对应。如:

    c3=i+c2;  //正确,类型匹配

    c3=c2+i;  //错误,类型不匹配

 

请注意,数学上的交换律在此不适用。如果希望适用交换律,则应再重载一次运算符“+”。如

    Complex operator+(Complex &c, int &i) //此时第一个参数为类对象

    {

        return Complex(i+c.real, c.imag);

    }

这样,使用表达式i+c2和c2+i都合法,编译系统会根据表达式的形式选择调用与之匹配的运算符重载函数。可以将以上两个运算符重载函数都作为友元函数,也可以将一个运算符重载函数(运算符左侧为对象名的) 作为成员函数,另一个(运算符左侧不是对象名的)作为友元函数。但不可能将两个都作为成员函数,原因是显然的。

 

来自

你可能感兴趣的:(灌水刷积分)