C ++嵌套类可访问性

时间:2011-08-09 15:04:54

标签: c++ oop

在两个类之间给出以下代码而不考虑友谊

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的所有成员

如果我的理解不正确,请纠正我。

4 个答案:

答案 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)

嵌套类对封闭类没有特殊的访问权限。