【问题标题】:Friend declaration in C++ - difference between public and privateC ++中的朋友声明-公共和私有之间的区别
【发布时间】:2011-09-18 11:00:32
【问题描述】:

将友元函数/类声明为私有或公有有区别吗?我似乎无法在网上找到任何关于此的内容。

我的意思是:

class A
{
 public: 
      friend class B;
 };

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

有区别吗?

【问题讨论】:

  • 这样的错误信息……某人不配成为朋友。是否喜欢您的朋友与您的私人关系完全取决于您。
  • 请问朋友班是什么:'(?
  • @I Phantasm - 这是一个声明,它允许friend 类的实例访问在作出声明的类中声明为private 的成员。在本例中,B 类的实例可以访问 A 类的私有成员
  • 这个问题在这个网站上为我赢得了太多积分。那好吧。

标签: c++ private friend public


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 回答一个七年前的问题而不是新手。请不要让事情变得更加重复。
    【解决方案3】:

    由于语法friend class B 没有声明类A成员,所以不管你写在哪里,类B 是类@ 的朋友987654324@。

    另外,如果您在Aprotected 部分写入friend class B,则并不意味着B 只能访问protectedpublicA 成员。

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

    【讨论】:

    • 所以我猜是谁告诉我的只是不知道他们在说什么。谢谢:)
    【解决方案4】:

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

    【讨论】:

    • 所以我猜是谁告诉我的只是不知道他们在说什么。谢谢:)
    • 但出于文档目的,您会将friend 视为实现细节还是接口的一部分?
    • @TemplateRex:IMO 是接口的一部分 - 有一些(随机的)class Friend 可以访问当前类的所有私有成员,这是相当有力的声明。
    • 对于随机类,是的。但是假设您使用T 的私有数据成员实现operator==(T, T),并使用friend 作为实现细节,以便operator== 可以作为非成员出现。 IMO,这种友谊不应该出现在公共界面中(例如由 Doxygen 生成)
    • 我前段时间在 stackoverflow 中读到,如果朋友声明发生在非公共区域内,一些编译器(我猜是一些旧的错误的编译器)会感到困惑。
    猜你喜欢
    • 2017-01-03
    • 1970-01-01
    • 2013-08-09
    • 2011-05-25
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多