在两个类之间给出以下代码而不考虑友谊:
class OutSideClass
{
...
public:
int i_pub;
protected:
int i_pro;
private:
int i_pri;
class InSideClass
{
...
public:
int j_pub;
protected:
int j_pro;
private:
int j_pri;
};
};
问题1>是的,OutSideClass只能访问InSideClass的公共成员
问题2> InSideClass是否可以访问OutSideClass的所有成员
如果我的理解不正确,请纠正我。
答案 0 :(得分:30)
问题1>是的,OutSideClass只能访问InSideClass的公共成员
是
问题2> InSideClass是否可以访问OutSideClass的所有成员
不,在C ++ 03中。是的,在C ++ 11中。
标准文本对此非常清楚:
C ++标准版(2003)以11.8美元/ 1 [class.access.nest]的形式说,
嵌套类的成员对a的成员没有特殊访问权限 封闭类,也不包括已授予的类或函数 对一个封闭的阶级的友谊;通常的准入规则(第11条) 应遵守。 封闭类的成员没有特殊之处 访问嵌套类的成员;通常的访问规则(条款 11)应遵守。
但是,标准报价有一个缺陷。它说嵌套类无法访问封闭类的私有成员。但是在C ++ 11中,它已得到纠正:在C ++ 11中,嵌套类可以访问封闭类的私有成员(尽管封闭类仍然无法访问嵌套类的私有成员)。
请参阅此缺陷报告:
答案 1 :(得分:3)
作为@Nawaz points out,在C ++ 03中,嵌套类对封闭类的成员没有特殊的访问权限。但是,通过将嵌套类声明为朋友,可以轻松解决此限制。
class OutSideClass
{
...
class InSideClass
{
...
};
friend class InSideClass;
};
答案 2 :(得分:1)
C ++中所有嵌套类都将内部类放在外部类的命名空间中。要从OutSideClass的成员函数实例化InSideClass的实例,我只是做
InSideClass *instance = new InSideClass();
如果InsideClass是公共的,我想从不是OutSideClass成员的函数实例化InSideClass,我输入:
OutSideClass::InSideClass *instance = new OutSideClass::InSideClass();
InSideClass和OutSideClass完全是分开的,与Java等其他语言不同。
答案 3 :(得分:-1)
嵌套类对封闭类没有特殊的访问权限。