C++中的友元声明 - public和private之间的区别

177

将友元函数/类声明为私有(private)或公共(public),是否有区别?我在网上找不到相关资料。

我是指以下两种情况之间的区别:

class A
{
 public: 
      friend class B;
 };

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

有什么区别吗?


34
这样的错误信息...某些人不应该成为朋友。你是否喜欢和私处一起埋藏你的朋友,完全取决于你自己。 - Tony Delroy
我可以问一下什么是友元类吗?:'( - I Phantasm I
6
@I Phantasm - 这是一个声明,允许friend类的实例访问声明为private的类中的成员。在这个例子中,类B的实例可以访问类A的私有成员。 - BIU
3
这个问题为我在这个网站上赚取了太多的积分。好吧,那就这样吧。 - BIU
4个回答

172

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


5
我猜说这话的人不知道他们在说什么。谢谢 :) - BIU
1
但是出于文档目的,您是否认为“友元”是实现细节还是接口的一部分? - TemplateRex
1
@TemplateRex: 在我看来,这是接口的一部分——声称存在某个(随意的)“class Friend”可以访问当前类的所有私有成员是相当强的说法。 - sharptooth
对于随机类,是的。但是假设您使用T的私有数据成员实现operator==(T, T),并使用friend作为实现细节,以便operator==可以出现为非成员函数。在我看来,这种友元关系不应出现在公共接口中(例如Doxygen生成的接口)。 - TemplateRex
我在StackOverflow上读到过一些编译器(我猜是一些旧的有缺陷的编译器)会因为友元声明出现在非公共区域而感到困惑。 - ABu

43

由于语法 friend class B 不声明类 A 的成员,因此无论在哪里编写,类 B 都是类 A 的友元。

此外,如果您在 Aprotected 部分中编写 friend class B,则并不意味着 B 只能访问 Aprotectedpublic 成员。

请记住,一旦 B 成为 A 的友元,它就可以访问 任何 A 的成员,而不管您在哪个部分写入 friend class B


4
所以我猜那个告诉我的人只是不知道他们在说什么。谢谢 :) - BIU

2

-4
友元声明出现在类体中,授予函数或另一个类访问友元声明所在类的私有和受保护成员的权限。
因此,访问说明符对友元声明的含义没有影响(它们可以出现在 private: 或 public: 部分,没有区别)。

2
回答一个七年前的问题并不意味着它是新的。请避免让事情变得更加重复。 - MAChitgarha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接