我有一个外部类A
。它有一个方法A::fun
。在这个方法中,它有一个本地或内部类B
。我的问题是:是B
朋友A
吗?
我认为不是。这样对吗?如果是这样,我认为让类B
的朋友A
是非常有益的,因为B
可以访问A
的私有和受保护的成员。此外,由于B
在方法中是本地的,因此其他人无法访问它,因此作为 . 的朋友是安全的A
。如何解决让B
访问A
的私有和受保护成员?
不,他们不是朋友。
但是本地类对函数外部名称的访问权限与函数本身的访问权限相同。
标准说:
9.8 本地类声明 [class.local]
类可以在函数定义中声明;这样的类称为本地类。本地类的名称在其封闭范围内是本地的。本地类在封闭作用域的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。本地类中的声明不得在封闭范围内使用(3.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。