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

which "<<" operator function should be used?

本文关键字:lt 运算符 函数      更新时间:2023-10-16

在项目中有两种实现运算符"<<"或">>"函数的方法。

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&运算符<<(std::estream&aamp;,xxx&(’"。

有人能帮忙编译上面的代码吗。

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

您似乎很困惑——友元函数非成员函数。因此,您的friend声明声明了非成员函数并使其成为朋友。然后定义两次(非成员(函数,这是一个错误。

定义(大多数(重载运算符的两种方法是作为成员函数或非成员函数。对于同一个操作员,你不能同时做这两件事,如果你将其定义为非成员,它可能是你的朋友,也可能不是你喜欢的朋友(friend无关紧要(

至于最后一个问题——不能将operator=定义为非成员函数。它必须为成员函数。CCD_ 4无关。

这两个定义是相同的。在您的情况下,运算符没有访问类的私有或受保护成员,因此友元声明是多余的。