在类声明中定义朋友功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在类声明中定义朋友功能相关的知识,希望对你有一定的参考价值。

我发现可以在类声明中定义朋友功能。我对它的含义有些困惑,因为类声明不提供其主体,通常它只是class A;

朋友函数可以在类内部定义(给定函数体)声明。这些函数是内联函数,就像成员一样内联函数的行为就像它们是立即定义的一样在看到所有班级成员之后但在班级范围之前关闭(类声明的末尾)。朋友功能是在类声明中定义的内容在封闭范围内课。

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

答案

这意味着

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);
    
        return os << a.m1 << a.m2;
    
;

inline std::ostream operator << (std::ostream os, const A&a);

    return os << a.m1 << a.m2;

另一答案

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

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

请注意,如果没有在授予友谊的类之外声明此类朋友功能,则它是不可见的。只能通过依赖于参数的名称查找找到它。

这里是演示程序。

#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 ) );

用括号括住函数名称会关闭依赖于参数的查找并调用非朋友函数。

以上是关于在类声明中定义朋友功能的主要内容,如果未能解决你的问题,请参考以下文章

Java 全局变量 声明与定义

尝试在类定义中声明数组时出错

在类中声明自定义比较器时类型/值不匹配

在类定义中声明一个随机类的对象

php--在类中声明常量的关键字

C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]