访问内部类中外部类的私有成员数据

时间:2012-01-15 13:18:55

标签: c++ nested-class

有这段代码:

#include <iostream>

class Outer{
    int a; // private data member of class Outer
public:
    Outer(): a(55){}
    class Inner{
    public:
        void fun(Outer ob){
            std::cout << ob.a << std::endl;
        }
    };
};

int main() {

    Outer::Inner object;
    object.fun(Outer()); // prints 55
    //std::cout << (Outer().a) << std::endl; error: 'int Outer::a' is private

    return 0;
} 

为什么内部类可以访问类外部的私有成员数据'a'?在本文XL C/C++ V8.0 for Linux之后,它不应该编译,但它在g ++ 4.4.0上编译。

2 个答案:

答案 0 :(得分:9)

C ++ 03 Standard $ 11.8 / 1:[class.access.nest]

嵌套类的成员对封闭类的成员没有特殊访问权限,也没有对已经为封闭类授予友谊的类或函数;应遵守通常的准入规则(第11条)。 封闭类的成员对嵌套类的成员没有特殊访问权限;应遵守通常的准入规则(第11条)。

但这是一个缺陷:

<强> 45. Access to nested classes

在C ++ 11中,这已得到纠正:在C ++ 11中,嵌套类可以访问封闭类的私有成员(尽管封闭类仍然无法访问嵌套类的私有成员)

C ++ 11 Standard 11.7嵌套类:

  

嵌套类是成员,因此具有与任何其他成员相同的访问权限。封闭类的成员对嵌套类的成员没有特殊访问权限;通常的访问规则(第11条)   应遵守。 [

class E {
  int x;
  class B { };
  class I {
    B b; // OK:E::I can accessE::B
    int y;
    void f(E* p, int i) {
      p->x = i; // OK:E::I can accessE::x
    }
  };
  int g(I* p) {
    return p->y; // error:I::y is private
  }
};
—end example]

该示例类似于您所讨论的示例,它清楚地显示了其有效行为。

答案 1 :(得分:4)

根据该文档,XL C / C ++ V8.0不支持C ++ 11,请参阅“语言标准合规性”部分。

  

编译器支持C和C ++的以下编程语言规范:

     
      
  • ISO / IEC 9899:1999(C99)
  •   
  • ISO / IEC 9899:1990(简称C89)
  •   
  • ISO / IEC 14882:2003(简称标准C ++)
  •   
  • ISO / IEC 14882:1998,该语言的第一个官方规范   (简称C ++ 98)
  •   

现行标准(ISO / IEC 14882:2011 11.7):

  

嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。封闭类的成员对嵌套类的成员没有特殊访问权限。应遵守通常的准入规则(第11条)。

在之前的语言标准中,是否允许此访问,或者至少不清楚是否应该允许此访问,具体取决于您的解释。