我在社区内外阅读了一些关于嵌套类的帖子,我很困惑。
据我所知,在 C ++中,嵌套类与单独/独立类没有任何不同。
当我试图更好地理解conecpt时,我编写了一个简单的代码,我发现内部类可以访问外部类而不会从外部类中获得友谊。
例如:
class Outer {
private : // default access modifier
int x;
static int sx;
public:
class Inner {
public:
void changeOuterDataMemberValues(int value) {
sx = value; // changes the private static data member of Outer.
Outer out;
out.x = value; // changes the private data member via object (not via class!)
}
void printMyOuterDataMember() {
cout << sx; // prints the private data member of Outer.
}
};
};
class Lonesome {
void tryingToChangeDataMemberValue(int value) {
Outer::sx = value; // cannot change the private static data member of Outer.
}
};
int Outer::sx;
您可以看到嵌套在Outer类中的Inner类可以访问其(Outer类)数据成员,而Lonesome作为独立类无法访问Outer类数据成员。
如果这是一个重复或愚蠢的问题我很抱歉,但我只是想和你们确认一个嵌套类和独立类之间有区别(两个不同的类没有有内在/外在的关系)。
谢谢大家, Syndicator =]
答案 0 :(得分:21)
在这方面,C ++ 03和C ++ 11之间存在差异。所以答案取决于您使用的编译器。
如果您使用符合C ++ 03的编译器,那么:
嵌套类无法访问封闭类的所有成员。
如果您正在使用符合C ++ 11的编译器,那么:
嵌套类可以访问封闭类的所有成员。嵌套类被视为该类的另一个成员。
C ++ 03标准11.8嵌套类:
§1
嵌套类的成员对封闭类的成员没有特殊访问权限,也没有对已经为封闭类授予友谊的类或函数;应遵守通常的访问规则。
C ++ 11 Standard 11.7嵌套类:
嵌套类是成员,因此具有与任何其他成员相同的访问权限。
答案 1 :(得分:3)
从标准第11.7节开始:
1 - 嵌套类是成员,因此具有与任何其他成员相同的访问权限。封闭类的成员对嵌套类[...]
的成员没有特殊访问权限
因此,嵌套(“内部”)类实际上是封闭类的朋友。
答案 2 :(得分:2)
你自己回答了你的问题:
您可以看到嵌套在Outer类中的Inner类可以访问其(Outer类)数据成员,而Lonesome作为独立类无法访问Outer类数据成员。
注意与C ++中的Java相反,您无法访问Outer
类的非静态成员。
通常的做法是将Outer
课程引用到Inner
课程。
class Outer {
private : // default access modifier
int x;
static int sx;
public:
class Inner {
public:
Inner( Outer & o ) : m_outer( o ) {}
void changeOuterDataMemberValues(int value) {
sx = value; // changes the private static data member of Outer.
//Outer out;
//out.x = value; // changes the private data member via object (not via class!)
m_outer.x = value; // <---------
}
void printMyOuterDataMember() {
cout << sx; // prints the private data member of Outer.
cout << m_outer.x;
}
private:
Outer & m_outer;
};
};