天天看点

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;//因为加了个友元函数所以也可以交换顺序了。

来自 <http://www.runoob.com/cplusplus/binary-operators-overloading.html>

总结:

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

来自 <http://c.biancheng.net/cpp/biancheng/view/217.html>