我发现可以在类声明中定义朋友功能。我对它的含义有些困惑,因为类声明不提供其主体,通常它只是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 ) );
用括号括住函数名称会关闭依赖于参数的查找并调用非朋友函数。