应该使用哪个“<<”运算符函数?
问题描述:
在项目中实现运算符“< <”或“>>”函数有两种方法。应该使用哪个“<<”运算符函数?
1.As非成员函数
2.As朋友
#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 &',xxx &'')重新定义'std :: ostream &运营商< <(std :: ostream &,xxx &)'“。
任何人都可以请帮助如何编译上面的代码。
也想知道在哪种情况下我们应该使用非成员“operator =”函数通过朋友“operator =”函数。
答
这两个定义是相同的。而在你的情况下,运营商不访问私人或受保护的班级成员,所以朋友声明是多余的。
答
你好像很困惑 - 朋友功能是非会员功能。所以你的friend
声明声明非成员函数,并使其成为朋友。然后你定义两次(非成员)函数,这是一个错误。
定义(大多数)重载操作符的两种方法是作为成员函数或非成员函数。不能为同一个运营商都做,如果你把它定义为一个非成员,也可能是朋友或不根据自己的喜好(friend
无关)
至于你的最后一个问题 - 你不能定义operator=
作为非会员功能。它必须是一个成员函数。 friend
是无关紧要的。
如果你声明了一个朋友函数,那么它实际上也是一个非成员函数。 –
成为朋友,如果它需要成为一个。 –
'operator ='不能是非会员或朋友;它必须是一个成员。 –