使用访问说明符加强类的封装性,两种访问说明符:private和public
定义在public说明符之后的成员在整个程序内可被访问,public成员定义类的接口;
定义在private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private部分封装了类的实现细节。
作为接口的一部分,构造函数和部分成员函数紧跟在public说明符之后;而数据成员和作为实现部分的函数则跟在private说明符之后。
一个类可以包含0或多个访问说明符,而且对于某个访问说明符能出现多少次也没有严格限定。每个访问说明符指定了接下来的成员的访问级别,其有效范围直到出现下一个访问说明符或者到达类的结尾处为止。
使用class和struct关键字
两者的区别是默认访问权限不同。
使用struct关键字,定义在第一个访问说明符之前的成员是public的;
相反,如果使用class关键字,则这些成员是private的。
友元
类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或者函数成为它的友元。如果类想把一个函数作为它的友元,只需要增加一条以friend关键字开头的函数声明语句即可。
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
友元的声明仅指定了访问的权限,而非一个通常意义上的函数声明。为了使友元的用户能够调用某个友元函数,必须在友元声明之外再专门对函数进行一次声明。
class INTEGER
{
friend void Print(const INTEGER& obj);//声明友元函数
};
void Print(const INTEGER& obj)
{
//函数体
}
void main()
{
INTEGER obj;
Print(obj);//直接调用
}
一般来说,最好在类定义开始或结束前的位置集中声明友元。
封装的优点:
确保用户代码不会无意间破会封装对象的状态;
被封装的类的具体实现细节可以随时改变,而无需调整用户级别的代码。
一旦把数据成员定义成private的,类的作者就可以比较自由地修改数据;
把数据成员的访问权限设置成private能防止由于用户的原因造成数据破坏。