类的方法中的本地类是这个类的朋友吗?

时间:2013-08-28 14:52:16

标签: c++ class friend

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

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

3 个答案:

答案 0 :(得分:14)

不,他们不是朋友。

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

标准说:

  

9.8本地类声明[class.local]

     

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

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

但在那之后:

  • 类的朋友是一个被授予使用该类中的私有和受保护成员名称的权限的函数或类。
  • 本地类位于封闭范围的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。也就是说,它可以访问函数所属类的受保护和私有成员。

答案 1 :(得分:6)

不,他们不是朋友。但这有关系吗? 并不是的!考虑这些事实:

  1. 在成员函数中,您始终可以访问该函数所属的类的成员。
  2. 您无法在函数之外的任何位置访问本地类。
  3. 所以,如果他们是朋友,那就不重要了。你总是会在其成员函数中引用外部类成员。

    <强> Online Sample:

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

答案 2 :(得分:3)

这在Clang编译:

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

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

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

见[class.access] p2。