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

Posted

技术标签:

【中文标题】类的方法中的本地类是这个类的朋友吗?【英文标题】:Is a local class in a method of a class a friend of this class? 【发布时间】:2013-08-28 14:52:15 【问题描述】:

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

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

【问题讨论】:

如果你没有明确说他们是朋友,那么他们就不是朋友。 @andre 我不认为有一种语法方式可以让他们成为朋友。 【参考方案1】:

不,他们不是朋友。

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

标准说:

9.8 本地类声明 [class.local]

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

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

但在那之后:

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

【讨论】:

【参考方案2】:

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

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

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

Online Sample:

class A

    int i;
    void doSomething()
    
        class Bpublic: int ii;;
        B obj;
        obj.ii = i;
    
;

int main()

    return 0;

【讨论】:

我没有投反对票,但我对问题中友谊的解释是相反的:B 可以看到A 的非公开成员吗? @juanchopanza:几乎没有关系,因为本地类名在封闭范围内是本地的,不能在本地范围之外使用此名称,并且本地范围在成员函数中,因此始终可以访问外部类成员. @juanchopanza 友谊是友谊,能看到私人会员就是能看到私人会员【参考方案3】:

这在 Clang 中编译:

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

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

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

参见 [class.access]p2。

【讨论】:

+1 表示它不是朋友,但仍然可以访问私人成员。

以上是关于类的方法中的本地类是这个类的朋友吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果我只知道 python 中的绑定方法,如何获取类的名称? [复制]

java -- Object类和String类

Object类的方法

java有这种写法吗?生成一个对象的同时还覆盖重写了父类的方法…………

类是如何被加载的?

与朋友一起使用超类的私有变量