成员函数重载运算符和友元函数重载运算符的比较

http://blog.163.com/arthur0808@126/blog/static/17120709720109163859518/

1.对双目运算符而言,成员函数重载运算符的函数参数表中只有一个参数,而用友元函数重载运算符函数参数表中含有两个参数。
  对单木运算符来说,成员函数重载运算符的函数参数表中没有参数,而用友元函数重载运算符函数参数表中含有一个函数。这个问题要搞清楚,有一个this
指针的问题。。。
2.双目运算符一般可以用友元函数重载和成员函数重载,但有一种情况只可以用友元函数重载。
  即:双目运算符左边的变量是一个常量,而不是对象!!!这点很重要的额。

书上推荐的一般经验:
   1.对于单目运算符,建议选择成员函数; 双目运算符最好重载为类的友元函数。
   2.对于有些双目运算符“=,(),[],->”只能作为成员函数;
   3.对于运算符“+ =,-=,/=,*=,&=,!=,~=,%=,<<=,>>=”建议重载为成员函数;
   4.对于其他运算符,建议重载为友元函数。
对于class中将operator函数定义为friend主要有以下考虑:
1.friend function是对外公开的(其实这样想,多个类中都声明这个函数,则这个友元函数可以访问多个类的成员),而class method是属于对象的,有些情况调用不方便
2.对某些需要两个参数的operator function,定义friend比较方便,如下例中operator <<
3.所有class   method必须有匹配的左值类型进行调用而friend则无需这样,只要能隐式转化成当前类型就可以调用该函数,因此如下例构造函数没有定义为explicit的,可以进行隐式转化,就可以在不同类型间运算。  
下面的例子可以很好的说明定义为friend   function的好处.   
 
#include<iostream>
using namespace std;

class   point
{
          int   x;
          int   y;
          public:
          point(int   vx=0)
          {
              x=vx;
              y=0;
          }
          point(int   vx,int   vy):x(vx),y(vy){}//其实很像  int x(vx)  int y(vy)

          friend   point   operator   +(point   p1,point   p2);
          friend   ostream   &   operator   <<(ostream   &output,point   &p1);
};
point   operator   +(point   p1,point   p2)
{
          point   p;
          p.x=p1.x+p2.x;
          p.y=p1.y+p2.y;
          return   p;
}

ostream   &   operator   <<(ostream   &output,point   &p1)
{
          output<<p1.x<<'+'<<p1.y<<'i'<<endl;
          return   output;
}

int   main()
{
        point   p1(1,2),p2(5,6);
        point   p3,p4;
        p3=p1+p2;
        p4=1+p2;//如果定义为class   method,编译将出错!类提供了相应的构造函数,且非explicit
        cout<<p1<<p2;
        cout<<p3<<p4;
        return     0;
}

你可能感兴趣的:(C++,c)