是类的方法中的局部类,是该类的朋友

Is a local class in a method of a class a friend of this class?

本文关键字:朋友 方法 局部      更新时间:2023-10-16

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

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

不,他们不是朋友。

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

标准上写着:

9.8本地类声明[class.Local]

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

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

但在那之后:

  • 类的友元是一个函数或类,它被授予使用该类的私有和受保护成员名的权限
  • 本地类在封闭作用域的作用域中,并且与封闭函数一样可以访问函数外的名称。也就是说,它可以访问函数所属类的受保护成员和私有成员
不,他们不是朋友。但这有关系吗
不是真的!考虑以下事实:
  1. 在成员函数中,您将始终可以访问该函数所属类的成员
  2. 不能在函数之外的任何位置访问本地类

所以他们是不是朋友并不重要。您将总是在其成员函数中引用外部类成员。

在线样本:

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

这在Clang:中编译

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

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

参见[class.access]p2。