有两种实现运算符“<<”的方法或“>>”在项目中发挥作用。
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 =”函数。
答案 0 :(得分:2)
您似乎感到困惑 - 朋友功能 是非会员功能。因此,您的friend
声明声明非成员函数并使其成为朋友。然后,您将(非成员)函数定义两次,这是一个错误。
定义(大多数)重载运算符的两种方法是成员函数或非成员函数。您不能同时为同一个运营商执行这两项操作,如果您将其定义为非会员,则可能是您喜欢的朋友(friend
无关紧要)
至于你的最后一个问题 - 你不能将operator=
定义为非成员函数。 必须是会员功能。 friend
无关紧要。
答案 1 :(得分:1)
这两个定义是相同的。在您的情况下,操作员不访问该类的私有或受保护成员,因此该朋友声明是多余的。