有这个代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
为什么内部类可以访问类外部的私有成员数据'a'?在本文XL C/C++ V8.0 for Linux之后,它不应该编译,但它在g ++ 4.4.0上编译.
C++ 03 Standard $ 11.8/1:[class.access.nest]
嵌套类的成员对封闭类的成员没有特殊访问权限,也没有对已经为封闭类授予友谊的类或函数的特殊访问权限.应遵守通常的准入规则(第11条).封闭类的成员对嵌套类的成员没有特殊访问权限; 应遵守通常的准入规则(第11条).
但这是一个缺陷:
在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]
Run Code Online (Sandbox Code Playgroud)
该示例类似于您所讨论的示例,它清楚地显示了其有效行为.
根据该文档,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 条)。
在以前的语言标准中,是否不允许这种访问,或者至少不清楚是否应该允许它,具体取决于您的解释。
| 归档时间: |
|
| 查看次数: |
2853 次 |
| 最近记录: |