哪个“<<<应该使用运算符函数?

时间:2015-09-26 17:59:58

标签: c++ friend

有两种实现运算符“<<”的方法或“>>”在项目中发挥作用。

1.作为非会员职能

2.作为朋友

  #include<iostream>
  using namespace std;
  class xxx{
     private: int x;
     public: xxx(int val=0):x(val){}
              int getx(){return x;}
             friend ostream& operator <<(ostream& o, xxx& x1);
  };
  ostream& operator<<(ostream& o, xxx& x1)
  {
    o<<x1.getx();
    return o;
  }
  ostream& operator <<(ostream& o, xxx& x1)
  {
     o<<x1.getx();
     return o;
  }
  int main(int argc, char *argv[])
  {
     xxx x1(5);
     return 0;
  }

在实现时看起来非成员函数和友元函数都具有相同的签名,因此我得到编译器错误: “错误:重新定义'std :: ostream&amp; operator&lt;&lt;(std :: ostream&amp;,xxx&amp;)'”。

有没有人可以帮忙如何编译上面的代码。

另外想知道在哪种情况下我们应该使用非成员“operator =”函数而不是朋友“operator =”函数。

2 个答案:

答案 0 :(得分:2)

您似乎感到困惑 - 朋友功能 是非会员功能。因此,您的friend声明声明非成员函数并使其成为朋友。然后,您将(非成员)函数定义两次,这是一个错误。

定义(大多数)重载运算符的两种方法是成员函数或非成员函数。您不能同时为同一个运营商执行这两项操作,如果您将其定义为非会员,则可能是您喜欢的朋友(friend无关紧要)

至于你的最后一个问题 - 你不能将operator=定义为非成员函数。 必须是会员功能。 friend无关紧要。

答案 1 :(得分:1)

这两个定义是相同的。在您的情况下,操作员不访问该类的私有或受保护成员,因此该朋友声明是多余的。