15.2.1 嵌套类和访问权限
有两种访问权限适合于嵌套类。首先,嵌套类的声明位置决定了嵌套类的作用域,即它决定了程序的哪些部分可以创建这种类的对象。其次,和其他类一样,嵌套类的公有部分、保护部分和私有部分控制了对类成员的访问。在哪些地方可以使用嵌套类以及如何使用嵌套类,取决于作用域和访问控制。下面将更详细地进行介绍。
1.作用域
如果嵌套类是在另一个类的私有部分声明的,则只有后者知道它。在前一个例子中,被嵌套在Queue声明中的Node类就属于这种情况(看起来Node是在私有部分之前定义的,但别忘了,类的默认访问权限是私有的),因此,Queue成员可以使用Node对象和指向Node对象的指针,但是程序的其他部分甚至不知道存在Node类。对于从Queue派生而来的类,Node也是不可见的,因为派生类不能直接访问基类的私有部分。
如果嵌套类是在另一个类的保护部分声明的,则它对于后者来说是可见的,但是对于外部世界则是不可见的。然而,在这种情况中,派生类将知道嵌套类,并可以直接创建这种类型的对象。
如果嵌套类是在另一个类的公有部分声明的,则允许后者、后者的派生类以及外部世界使用它,因为它是公有的。然而,由于嵌套类的作用域为包含它的类,因此在外部世界使用它时,必须使用类限定符。例如,假设有下面的声明:
现在假定有一个失业的教练,他不属于任何球队。要在Team类的外面创建Coach对象,可以这样做:
嵌套结构和枚举的作用域与此相同。其实,很多程序员都使用公有枚举来提供可供客户程序员使用的类常数。例如,很多类实现都被定义为支持iostream使用这种技术来提供不同的格式选项,前面已经介绍过这方面的内容,第17章将更加全面地进行介绍。表15.1总结了嵌套类、结构和枚举的作用域特征。
表15.1 嵌套类、结构和枚举的作用域特征
|
声明位置< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
包含它的类
是否可以使用它 |
从包含它的类派生而
来的类是否可以使用它 |
在外部是否
可以使用 |
|
私有部分 |
是 |
否 |
否 |
|
保护部分 |
是 |
是 |
否 |
|
公有部分 |
是 |
是 |
是,通过类限
定符来使用 |
2.访问控制
类可见后,起决定作用的将是访问控制。对嵌套类访问权的控制规则与对常规类相同。在Queue类声明中声明Node类并没有赋予Queue类任何对Node类的访问特权,也没有赋予Node类任何对Queue类的访问特权。因此,Queue类对象只能显示地访问Node对象的公有成员。由于这个原因,在Queue示例中,Node类的所有成员都被声明为公有的。这样有悖于应将数据成员声明为私有的这一惯例,但Node类是Queue类内部实现的一项特性,对外部世界是不可见的。这是因为Node类是在Queue类的私有部分声明的。所以,虽然Queue的方法可直接访问Node的成员,但使用Queue类的客户不能这样做。
总之,类声明的位置决定了类的作用域或可见性。类可见后,访问控制规则(公有、保护、私有、友元)将决定程序对嵌套类成员的访问权限。