【问题标题】:Defining friend function inside class declaration在类声明中定义友元函数
【发布时间】:2020-08-07 07:34:51
【问题描述】:

我发现友元函数可以在类声明中定义。由于类声明没有提供它的主体,我对它的含义有点困惑,一般来说它只是class A;

Friend 函数可以在类中定义(给定一个函数体) 声明。这些函数是内联函数,和成员一样 内联函数它们的行为就好像它们是立即定义的 在看到所有类成员之后但在类范围之前 关闭(类声明的结尾)。友函数是 在类声明中定义在封闭的范围内 类。

来源:https://docs.microsoft.com/en-us/cpp/cpp/friend-cpp?view=vs-2019

【问题讨论】:

  • 我的猜测是这只是一个错误,它们的意思是“在一个类定义中”
  • cppreference 似乎说class A; 是一个前向声明,而class A { /* ... */ } 也将是一个声明(它将声明类的成员)。 stackoverflow.com/a/1410632 似乎不同意。我以为所有的定义也是声明。

标签: c++ class friend-function function-definition


【解决方案1】:

意思是

class A
{
public:
    friend std::ostream& operator << (std::ostream& os, const A&a)
    {
        return os << a.m1 << a.m2;
    }
};

等价于

class A
{
public:
    friend std::ostream& operator << (std::ostream& os, const A&a);
};

inline std::ostream& operator << (std::ostream& os, const A&a)
{
    return os << a.m1 << a.m2;
}

【讨论】:

    【解决方案2】:

    一个类声明可以同时是一个类定义。

    您不能将友元函数定义放在未定义的类中。

    考虑到如果没有在授予友谊的类之外声明这样的朋友函数,那么它是不可见的。它只能通过参数依赖名称查找来找到。

    这是一个演示程序。

    #include <iostream>
    
    class A
    {
    private:
        int x;
    
    public:
        A( int x ) : x ( x ) {}
        operator int() const { return x; }
        friend void f( const A &a )
        {
            std::cout << "a.x = " << a.x << '\n';
        }
    };
    
    void f( int x )
    {
        std::cout << "x = " << x << '\n';
    }
    
    int main() 
    {
        f( A( 10 ) );
        ( f )( A( 20 ) );
    
        return 0;
    }
    

    程序输出是

    a.x = 10
    x = 20
    

    在本次通话中

    f( A( 10 ) );
    

    友元函数的名称是由于参数依赖查找而找到的。

    在本次通话中

    ( f )( A( 20 ) );
    

    将函数名括在括号中会关闭参数依赖查找并调用非友元函数。

    或者你可以使用一个合格的函数名,比如

    ::f( A( 20 ) );
    

    在这种情况下,ADL 也将不起作用,并且将调用非好友函数。

    还要记住,类中定义的友元函数在类的词法范围内。这意味着它可以使用类成员的名称。在类外定义的友元函数不在类的词法范围内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 2013-03-31
      相关资源
      最近更新 更多