如果我在C ++中定义一个内部类,它是否自动成为包含它的类的朋友?例如,这是合法的:
class Outer {
public:
class Inner {
public:
void mutateOuter(Outer& o);
};
private:
int value;
};
void Outer::Inner::mutateOuter(Outer& o) {
o.value ++; // Legal? Or not?
}
我问,因为在我试过的一些编译器(VS2003)上,这段代码不起作用,但我至少听说过它在某些编译器上有效。我无法在C ++规范中找到关于此的相关部分,如果有人能够引用某些具体的内容,那就是说它是合法的还是不合法的。
答案 0 :(得分:64)
在我自己或多或少地提出同样的问题here之后,我想分享(显然)更新的C ++ 11答案:
引自https://stackoverflow.com/a/14759027/1984137:
标准$ 11.7.1
“嵌套类是成员,因此具有相同的访问权限 任何其他成员。附上课程的成员没有特别之处 访问嵌套类的成员;通常的访问规则应该是 遵命“
和通常的访问规则指定:
“类的成员也可以访问该类的所有名称 有权访问......“
标准中给出了具体的例子:
class E {
int x;
class B { };
class I {
B b; // OK: E::I can access E::B
int y;
void f(E* p, int i) {
p->x = i; // OK: E::I can access E::x
}
};
}
答案 1 :(得分:37)
在C ++ 98和C ++ 03中,默认情况下,嵌套类不能访问封闭类的private
和protected
成员。
C ++标准版(2003)以11.8美元/ 1 [class.access.nest]的形式说,
嵌套类的成员没有 特殊访问成员 封闭类,也不包括类或 授予友谊的功能 到一个封闭的班级;通常 准入规则(第11条)应为 服从。 封闭的成员 class没有特殊的访问权限 嵌套类的成员; 通常的 准入规则(第11条)应为 服从。
标准本身的例子:
class E
{
int x;
class B { };
class I
{
B b; // error: E::B is private
int y;
void f(E* p, int i)
{
p->x = i; // error: E::x is private
}
};
int g(I* p)
{
return p->y; // error: I::y is private
}
};
自C ++ 11以来,上述限制已被删除。现在,嵌套类可以访问封闭类的private
和protected
成员:
class E
{
int x;
class B { };
class I
{
B b; // ok: even though E::B is private
int y;
void f(E* p, int i)
{
p->x = i; // ok: even though E::x is private
}
};
int g(I* p)
{
return p->y; // ok: even though I::y is private
}
};
希望有所帮助。
答案 2 :(得分:16)
由于提问者似乎接受了其中一个答案,这只是
补充。
该标准似乎改变了关于可访问性的规范。
§11.8/ 1声明:
N1804中的§11.8/ 1(TR1之后)声明:嵌套类的成员没有 特殊访问成员 封闭类,也不是类或 授予友谊的功能 到一个封闭的班级;通常 应遵守访问规则。
嵌套类是成员,因此 拥有与任何相同的访问权限 其他成员。
我认为当前的C ++编译器遵循更新的规范。
答案 3 :(得分:4)
此答案适用于(过时的)C ++ 03规范。此问题的接受答案更新。
好吧,我现在对于提出这个问题感到愚蠢,因为我刚刚找到了规范中涉及的相关部分:§11.8/ 1:
嵌套类的成员对封闭类的成员没有特殊访问权限,也没有对已经为封闭类授予友谊的类或函数的特殊访问权限。应遵守通常的访问规则(第11条)。封闭类的成员对嵌套类的成员没有特殊访问权限;应遵守通常的访问规则(第11条)
(我的重点)
所以看起来不行,内部类没有特殊的访问权限。
答案 4 :(得分:3)
我没有精确的位置,但我记得通过规范阅读并发现类中的任何私有数据都隐藏在所有其他类中,包括嵌套类。
基本上,嵌套类定义了某个范围,而不是访问权限。