成员函数(与整个 class 相对)可以成为 function/class 的朋友吗?

Can a member function (as opposed to the entire class) befriend a function/class?

函数 F 可以声明为 class C 的友元,这样它就可以访问整个 class.

的私有和受保护成员

但是有没有办法只允许 F 访问 C 的特定成员函数,而不是允许 F 访问整个 class?

This就是我想做的原因

不,你不能。

一个解决方法是将该特定成员函数放在一个单独的 class C2 中,C 从中继承,并与 C2 建立友谊。

没有办法直接用friendship做这个,但是你可以通过修改tag-based dispatching达到类似的效果:

class C
{
public:
  class AccessTag
  {
    friend class C;
    friend void F();
  private:
    AccessTag() {}
  };

  void functionToAccess(AccessTag)
  {
    std::cout << "Restricted function called!\n";
  }
};

void F()
{
  C c;
  c.functionToAccess(C::AccessTag()); // OK
}

void nonF()
{
  C c;
  c.functionToAccess(C::AccessTag()); // error, nonF cannot access ctor of C::AccesTag
}

这个想法是只允许 functionToAccess 被那些可以构造 C::AccessTag 对象的人调用。并且由于其私有构造函数,C::AccessTag 只能由其朋友构造。它们是 C(以便它可以调用 functionToAccess 本身,就像它可以调用它的任何其他私有函数一样)和 FF 无法访问 C 的任何其他非 public 成员,因为它不是 C.

的朋友

您甚至可以为不同的成员函数(或成员函数组)设置不同的访问标签。