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