访问说明符
在 C++语言中,我们使用访问说明符(access specifiers)加强类的封装性∶
- 定义在 public说明符之后的成员在整个程序内可被访问,public成员定义类的接口。
- 定义在private 说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private 部分封装了(即隐藏了)类的实现细节。
作为接口的一部分,构造函数和部分成员函数紧跟在 public说明符之后;
而数据成员和作为实现部分的函数则跟在 private 说明符后面。
一个类可以包含0个或多个访问说明符,而且对于某个访问说明符能出现多少次也没有严格限定。每个访问说明符指定了接下来的成员的访问级别,其有效范围直到出现下一个访问说明符或者到达类的结尾处为止。
封装
封装是指保护类的成员不被随意访问的能力。通过把类的实现细节设置为 private,我们就能完成类的封装。封装实现了类的接口和实现的分离。
封装有两个重要的优点∶
-
一是确保用户代码不会无意间破坏封装对象的状态;
-
二是被封装的类的具体实现细节可以随时改变,而无须调整用户级别的代码。
一旦把数据成员定义成 private 的,类的作者就可以比较自由地修改数据了。当实现部分发生改变时,只需要检查类的代码本身以确认这次改变有什么影响;
换句话说,只要类的接口不变,用户代码就无须改变。
如果数据是 public 的,则所有使用了原来数据成员的代码都可能失效,这时我们必须定位并重写所有依赖于老版本实现的代码,之后才能重新使用该程序。
把数据成员的访问权限设成 private 还有另外一个好处,这么做能防止由于用户的原因造成数据被破坏。
如果我们发现有程序缺陷破坏了对象的状态,则可以在有限的范围内定位缺陷:因为只有实现部分的代码可能产生这样的错误。因此,将错误的搜索限制在有限范围内将能极大地简化更改问题及修正程序等工作。
class和struct的区别
类可以在它的第一个访问说明符之前定义成员,对这种成员的访问权限依赖于类定义的方式。
如果使用 struct 关键字,则定义在第一个访问说明符之前的成员是 public的;
相反,如果使用class 关键字,则这些成员是 private的。
出于统一编程风格的考虑,当我们希望定义的类的所有成员是 public 的时,使用 struct;
反之,如果希望成员是 private 的,使用 class。