对类嵌套往往为了帮助实现另一个类,并避免名称冲突。如下:
class queue
{
private:
struct Node{ Item item;struct Node *next };
...
};
由于struct在默认情况下其成员为公有的, 所以Node实际上是一个嵌套类。
- 作用域
嵌套类的声明位置决定了嵌套类的作用域,即它决定了程序的那部分可以创建嵌套类的对象。
如果嵌套类声明在一个类的私有部分,则只有嵌套类的外部类可以知道它。上面的类就是这种情况。在queue这个类中,queue成员可以使用Node对象或Node对象的指针,但是程序的其他部分甚至不知道存在Node类。对于queue派生下来的类,也不知道Node的存在。
如果嵌套类声明在一个类的保护部分,对于后者是可见的,对于外界是不可见的。派生类知道该嵌套类,并且可以直接创建这种类型的对象。
如果嵌套类声明在一个类的公有部分,则允许后者,后者的派生类以及外部世界使用。然后在外部使用时,必须加上外部类的外部类作用域限制符。
class team
{
public
struct Coach{...};
...
};
使用Coach时,应该这样定义 team::Coach teach1;
嵌套结构和枚举的作用域于此相同。许多程序员使用公有的枚举提供客户使用的类常量。
下面表格总结了,嵌套类、结构、枚举的作用域特征。
声明位置 | 包含它的类是否可以使用它 | 从包含它的类派生下来的类是否可以使用它 | 外部是否可以使用它 |
公有 | 是 | 是 | 是 |
私有 | 是 | 否 | 否 |
保护 | 是 | 是 | 否 |
- 访问权限
在外部类中声明嵌套类并没有赋予外部类任何对嵌套类的访问权限,也没有赋予任何嵌套类对于外部类的访问权限。与一般类的访问控制相同(私有,公有,保护)。
- 代码测试
在外部类访问嵌套类
class test
{
public:
test()
{
i = 10; //不能访问
mytest::i = 10;//不能访问
}
private:
class mytest
{
int i;
int j;
};
};
不能直接访问mytest的成员,试着通过对象访问。
class test
{
public:
test()
{
cc.i = 10; //通过对象可以访问,如果i为私有则不可访问
}
private:
class mytest
{
public:
int i;
int j;
};
mytest cc;
};
通过测试,在外部类中声明一个嵌套类的对象。然后再外部类中利用该对象访问嵌套类,访问的规则与普通类相同。
在嵌套类中访问外部类
因为嵌套类中没有任何对外部类的访问权限。因此只有在嵌套类中定义了改对象,才能够访问其非静态成员,但此时外部类是一个不完整的类型(类没有定义完成)。因此想在嵌套类内部访问外部类是无法做到的。