使用访问说明符能够加强类的封装性:
public
说明符后的成员在整个程序内可被访问,public
成员定义类的接口。private
说明符之后的成员可被类的成员函数访问,但是不能被使用该类的代码访问,private
部分封装了类的实现。
一般的,构造函数和部分作为接口的成员函数定义紧跟在 public
说明符之后。
数据成员和作为实现部分的成员函数紧跟在 private
之后。
一个类可以包含0个或多个访问说明符,对于某个说明符出现多少次也没有限制。每个访问说明符指定接下来的成员访问级别,其有效范围直到出现下一个访问说明符或者到达类的末尾处为止。
封装的益处:
- 确保用户代码不会无意间破坏封装对象的状态。
- 被封装的类的具体实现细节可以随时改变,无须调整用户级别的代码。
使用 class 或 struct 关键字
定义一个类时可以使用 class
和 struct
关键字中任何一个,唯一的区别是 struct
和 class
的访问权限不一样。
类可以在它的第一个访问说明符之前定义成员:
- 如果使用
struct
关键字,则定义在第一个访问说明符之前的成员都是public
。 - 如果使用
class
关键字,则定义在第一个访问说明符之前的成员都是private
。
友元
类可以允许其他类型或者函数访问它的非公有成员,方法是令其他类或者函数成为它的友元。
如果类想把一个函数作为它的友元,只需要增加一条 friend
关键字开始的函数声明即可。
- 友元声明只能出现在类定义的内部,但是在类内出现的具体位置不限。
- 友元不是类的成员,也不受它所在区域访问控制级别的约束。
- 一般来说,最好在类定义开始或结束前的位置集中声明友元。
友元的声明
友元的声明仅仅指定了访问权限,而非一个通常意义上的函数声明。如果希望类的用户能够调用某个友元函数,那么必须在友元声明之外再专门对函数进行一次声明。
为了使友元对类的用户可见,通常把友元的声明与类本身放置在同一个头文件中(类的外部)。
一些编译器允许在尚无友元函数声明的情况下就调用它。不过即使编译器支持这种行为,最好还是提供一个独立的函数声明。