我们可以在cpp中定义类中的友元函数吗?

时间:2015-04-03 06:58:34

标签: c++ friend-function

  1. 根据规则,我们无法在类
  2. 中定义友元函数
  3. for istream和ostream我们总是在下面的代码中声明友方函数(所以它是对的)
  4. 但问题是第1点如何可能 给定代码在GNU(ubuntu)编译器上成功运行....

    #include<bits/stdc++.h>
    
    using namespace std;
    
    class dev{
        string str;
        int n;
    public:
        friend void operator >>(istream &din,dev &s1)
        {
            din>>s1.str>>s1.n;
        }
        friend void operator <<(ostream &dout,dev &s1)
        {
            dout<<s1.str<<" "<<s1.n;
        }
    };
    
    int main()
    {
        dev s2;
        cin>>s2;
        cout<<s2;
    }
    

1 个答案:

答案 0 :(得分:1)

根据C ++标准(11.3朋友)

  

6如果和,可以在类的朋友声明中定义函数   只有当类是非本地类(9.8)时,函数名才是   不合格,函数具有命名空间范围。

然而,除非在封闭的命名空间中声明它,否则它在类外部是不可见的。

然而,由于所谓的Argument Dependent Lookup,编译器可以找到该函数。

由于ADL,在您的示例中,运算符被成功调用。

例如,此声明

cout<<s2;

编译器发现使用了dev(dev s2;)类型的对象,并在类的范围内搜索运算符。

考虑到运算符返回对流的引用时更好。在这种情况下,您可以将运算符与其他流运算符组合使用。 例如

friend std::ostream & operator <<( std::ostream &dout, const dev &s1 )
{
    return dout << s1.str << " " << s1.n;
}