9

我有一个外部类A。它有一个方法A::fun。在这个方法中,它有一个本地或内部类B。我的问题是:是B朋友A吗?

我认为不是。这样对吗?如果是这样,我认为让类B的朋友A是非常有益的,因为B可以访问A的私有和受保护的成员。此外,由于B在方法中是本地的,因此其他人无法访问它,因此作为 . 的朋友是安全的A。如何解决让B访问A的私有和受保护成员?

4

3 回答 3

14

不,他们不是朋友。

但是本地类对函数外部名称的访问权限与函数本身的访问权限相同。

标准说:

9.8 本地类声明 [class.local]

类可以在函数定义中声明;这样的类称为本地类。本地类的名​​称在其封闭范围内是本地的。本地类在封闭作用域的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。本地类中的声明不得在封闭范围内使用(3.2)具有自动存储持续时间的变量。

计数的最大区别是您的本地类只能在函数内部访问。

但在那之后:

  • 类的朋友是一个函数或类,它被授予使用该类的私有和受保护成员名称的权限。
  • 本地类在封闭作用域的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。也就是说,它可以访问函数所属类的受保护和私有成员。
于 2013-08-28T15:00:09.850 回答
6

不,他们不是朋友。但这有关系吗?
并不真地!考虑以下事实:

  1. 在成员函数中,您将始终可以访问该函数所属类的成员。
  2. 您无法在函数之外的任何地方访问本地类。

因此,他们是否是朋友并不重要。您将始终在其成员函数中引用外部类成员。

在线样品:

class A
{
    int i;
    void doSomething()
    {
        class B{public: int ii;};
        B obj;
        obj.ii = i;
    }
};

int main()
{
    return 0;
}
于 2013-08-28T14:57:42.017 回答
3

这在 Clang 中编译:

class A {
  typedef int Int;
  void fn();
};

void A::fn() {
  class B {
    Int i;
  };
}

内部类可以访问 A 的私有成员,但不是因为它是朋友,而是因为它被认为是成员。由于类的成员可以访问私有成员,这包括内部类以及成员函数的本地类。

参见[class.access]p2。

于 2013-08-28T14:58:40.380 回答