成员空间可以访问父类的私有成员

时间:2013-07-17 12:09:03

标签: c++ idioms

我一直在阅读this article,当我在这个片段中注意到令我感到惊讶的事情时,我正在玩成员空间习惯用了一段时间(编译没有问题:http://ideone.com/hRiV5B):

class HugeClass
{
    public:
        struct memberspace
        {
            int f() const { return parent.f; }

            private:
                friend HugeClass;
                explicit memberspace(HugeClass & parent)
                : parent(parent) {}
                HugeClass & parent;
        } memberspace;

        HugeClass() : memberspace(*this), f(42) {}

    private:
        int f;
};

我原本以为编译错误导致HugeClass::f的访问不被允许,因为f在该上下文中是私有的。

HugeClassfriend的{​​{1}},因此memberspace可能会调用HugeClass的私有构造函数,但为什么它会以相反的方式工作明确声明memberspace memberspace friend?{/ p>

2 个答案:

答案 0 :(得分:6)

按照C ++ 11中的语言规则。

嵌套类是成员,因此具有与任何其他成员相同的访问权限。 例如:

class E {
   int x;
   class B { };
   class I {
     B b; // OK: E::I can access E::B
     void f(E* p, int i) 
     {
        p->x = i; // OK: E::I can access E::x
     }
   };
};

在C ++ 03中

嵌套类的成员无法访问封闭类的成员,也无法访问类或 已经给封闭类授予友谊的函数;通常的准入规则(第11条)应为 服从。

因此,C ++ 11中的示例不适用于c ++ 03编译器。

答案 1 :(得分:1)

memberspaceHugeClass的一部分,与其他类成员具有相同的访问权限。