C + + 中的朋友声明—— public 和 private 的区别

将好友函数/类声明为 private 或 public 有区别吗?我在网上找不到任何关于这个的信息。

我的意思是:

class A
{
public:
friend class B;
};

还有

class A
{
private: //or nothing as the default is private
friend class B;
};

有区别吗?

41635 次浏览

不,没有区别——你只需告诉 B 类是 A 类的朋友,现在可以访问它的私有和受保护的成员,就是这样。

由于语法 friend class B没有声明类 A成员,所以在哪里写它并不重要,类 B是类 A的朋友。

另外,如果你在 Aprotected部分写 friend class B,那么这并不意味着 B只能访问 Aprotectedpublic成员。

永远记住,一旦 B成为 A的朋友,它可以访问 A任何成员,无论你在哪个部分写 friend class B

好友声明出现在类主体中,并授予一个函数或另一个类对出现好友声明的类的私有和受保护成员的访问权。

因为这样的访问说明符对好友声明的含义没有影响(它们可以出现在 private: 或 public: 部分中,没有区别)。

C + + 有“隐藏朋友”的概念: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1601r0.pdf

它只适用于内联定义的好友函数。这使得函数只能通过依赖于参数的查找找到,并从封闭的名称空间中删除它们。