C ++中的朋友声明-公共和私有之间的区别


141

将朋友功能/类声明为私有或公开之间有区别吗?我似乎在网上找不到任何相关信息。

我的意思是:

class A
{
 public: 
      friend class B;
 };

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

有区别吗?


28
这样的错误信息...某人不配做朋友。是否喜欢与您的私密朋友共存完全取决于您。
Tony Delroy

我可以问一下什么是朋友班吗:'(?
我幻想我

3
@I Phantasm-这是一个声明,允许friend类的实例访问在进行声明private的类中声明的成员。在此示例中,B类的实例可以访问A类的私有成员
BIU


2
这个问题使我在这个网站上赢得了太多分。那好吧。
BIU 2014年

Answers:


138

不,没有区别-您只说B类是A类的朋友,现在就可以访问其私有成员和受保护成员,仅此而已。


5
所以我想无论谁告诉我,只是不知道他们在说什么。谢谢:)
BIU

但是出于文档目的,您会考虑friend实现细节或接口的一部分吗?
TemplateRex

1
@TemplateRex:IMO是接口的一部分-强烈声称有一些(随机)class Friend可以访问当前类的所有私有成员。
Sharptooth 2014年

对于随机班,是的。但是,请说您operator==(T, T)使用的私有数据成员来实现T,并friend用作实现细节,以便operator==可以作为非成员出现。IMO,这种友谊不应出现在公共界面中(例如Doxygen会生成的)
TemplateRex

我前段时间在stackoverflow上读到,如果朋友声明在非公共区域内发生,那么一些编译器(我猜是一些老的越野车)会感到困惑。
Peregring-lk

35

由于语法friend class B没有声明类的成员A,因此无论在哪里编写它都无所谓,所以class B是class 的朋友A

另外,如果你写friend class Bprotected部分A,那么它不意味着B仅可以访问protectedpublic成员A

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


3
所以我想无论谁告诉我,只是不知道他们在说什么。谢谢:)
BIU

-1

朋友声明出现在类主体中,并向出现朋友声明的类的私有和受保护成员授予函数或其他类访问权限。

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


回答一个已有七年历史的问题,而又不新鲜。请远离使事情重复的事情。
MAChitgarha
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.