我有一个外层A
。它有一个方法A::fun
。在此方法中,它具有本地或内部类B
。我的问题是:B
是A
的朋友吗?
我认为不是。这样对吗?如果是这样,我认为让B
的朋友A
非常有益,因为B
可以访问A
的私人和受保护成员。而且,由于B
在方法中是本地的,因此其他人无法访问它,因此A
的朋友是安全的。如何让B
访问A
的私人和受保护成员?
答案 0 :(得分:14)
不,他们不是朋友。
但是本地类对函数外部的名称具有与函数本身相同的访问权限。
标准说:
9.8本地类声明[class.local]
可以在函数定义中声明类;这样的类叫做本地类。本地类的名称是其封闭范围的本地名称。 本地类位于封闭范围的范围内,并且对函数外部的名称具有与封闭函数相同的访问权限。本地类中的声明不应使用(3.2)变量具有来自封闭范围的自动存储持续时间。
计算的最大区别是你的本地类只能在函数内部访问。
但在那之后:
答案 1 :(得分:6)
不,他们不是朋友。但这有关系吗? 并不是的!考虑这些事实:
所以,如果他们是朋友,那就不重要了。你总是会在其成员函数中引用外部类成员。
<强> 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。