友元类
友元函数用于类的扩展接口中,类并非只能拥有友元函数,也可以将类作为友元,该类称为友元类。
友元类的所有方法都可以访问原始类的私有成员和保护成员,但也可以对其做更严格的限制,使得特定的成员函数成为另一个类的友元。
友元类和继承、包含的关系
我们为什么要提供友元类的这种接口呢,它既然可以从外部访问类的私有部分的权限,是不是与我们面向对象的编程思想相悖呢?答案显然是否定的,那我们举个例子分析一下,友元类存在的意义。
假设我们要编写一个模拟电视机和遥控器的程序,我们用TV
和Remote
来分别表示电视机和遥控器,很显然,这两者之间不是is-a
(电视机不是遥控器一种,遥控器也不是电视机的一种)关系,也不是has-a
(电视机与遥控器没有明显的包含关系)关系,因此不能使用继承和包含的实现方法,但是遥控器可以调用电视机里面的某些功能,如调节音量、更换频道和开关机等等。这表明Remote
类应该作为TV
类的一个友元类,这样就可以轻松调TV
类中的成员和成员函数,来完成自己的接口实现。因此友元类不仅没有与面向对象的编程思想相悖,而且提高了公有接口的灵活性。
嵌套类
c++允许将类的声明放在另外一个类中,在另外一个类中声明的类被称为嵌套类。对类进行嵌套的主要目的是为了帮助实现另外一个类,并避免名称冲突。
类的嵌套和包含
包含往往意味着将类对象作为另外一个类的成员,而嵌套不创建类成员,而是定义一种类型,该类型仅在包含嵌套类声明中有效。
嵌套类的作用域特征:
声明位置 | 包含它的类是否可以使用它 | 从包含它的类派生而来的类是否可以使用它 | 在外部是否可以使用 |
---|---|---|---|
私有部分 | 是 | 否 | 否 |
保护部分 | 是 | 是 | 否 |
公有部分 | 是 | 是 | 是,通过类限定符来使用 |
(注:嵌套结构和枚举与嵌套类相似,也适用于上表。)
类声明的位置决定了类的作用域和可见性。类可见后,访问控制规则(公有、私有、保护、友元)决定程序对嵌套类成员的访问权限。
网友评论