2015-09-26 33 views
1

在项目中实现运算符“< <”或“>>”函数有两种方法。应该使用哪个“<<”运算符函数?

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 =”函数。

+5

如果你声明了一个朋友函数,那么它实际上也是一个非成员函数。 –

+0

成为朋友,如果它需要成为一个。 –

+2

'operator ='不能是非会员或朋友;它必须是一个成员。 –

回答

1

这两个定义是相同的。而在你的情况下,运营商不访问私人或受保护的班级成员,所以朋友声明是多余的。

2

你好像很困惑 - 朋友功能非会员功能。所以你的friend声明声明非成员函数,并使其成为朋友。然后你定义两次(非成员)函数,这是一个错误。

定义(大多数)重载操作符的两种方法是作为成员函数或非成员函数。不能为同一个运营商都做,如果你把它定义为一个非成员,也可能是朋友或不根据自己的喜好(friend无关)

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