1、公用接口与私有实现的分离
1、C++通过类来实现封装性,把数据和与这些数据有关的操作封装在一个类中,或者说,类的作用是把数据和算法封装在用户声明的抽象数据类型中。在面向对象的程序设计中,在声明类时,一般都是把所有的数据指定为私有的,使它们与外界隔离,把需要让外界调用的成员函数指定为公用的,外界通过公用的函数来实现对数据的操作。外界与对象惟一的联系渠道就是调用公用的成员函数。这样就使类与外界的联系减少到最低限度。
2、在声明了一个类以后,用户主要是通过调用公用的成员函数来实现类提供的功能(例如对数据成员赋值,显示数据成员的值,对数据进行加工等)。因此,公用成员函数是用户使用类的公用接口(pubic interface),或者说是类的对外接口。当然并不一定要把所有成员函数都指定为public(公用)的,但非public的成员函数就不是公用接口了。在类外虽然不能直接访问私有数据成员,但可以通过调用公用成员函数来引用甚至修改私有数据成员的值。
3、用户可以调用公用成员函数来实现某些功能,而这些功能是在声明类时已指定的,用户可以使用它们而不应改变它们。实际上用户往往并不关心这些功能是如何实现的细节,而只需知道调用哪个函数会得到什么结果,能实现什么功能即可。如同使用照相机一样,只需知道按下快门就能照相即可,不必了解其实现细节,那是设计师和制造商的事。
4、照相机的快门就是公用接口,用户通过使用快门实现照相的目的,但不能改变相机的结构和功能。一切与用户操作无关的部分都封装在机箱内,用户看不见,摸不着,改不了,这就是接口与实现分离。
通过成员函数对数据成员进行操作称为类的实现,为了防止用户任意修改公用成员函数,改变对数据进行的操作,往往不让用户看到公用成员函数的源代码,显然更不能修改它,用户只能接触到公用成员函数的目标代码。可以看到:类中被操作的数据是私有的,实现的细节对用户是隐蔽的,这种实现称为私有实现(pnvate implementation)。这种“类的公用接口与私有实现的分离”形成了信息隐蔽。
软件工程的一个最基本的原则就是将接口与实现分离,信息隐蔽是软件工程中一个非常重要的概念。它的好处在于: (1)如果想修改或扩充类的功能,只需修改奉类中有关的数据成员和与它有关的成员函数,程序中类外的部分可以不必修改。例如,想在声明的student类中增加一项数据成员“年龄”,只需这样改:class student
{ private: int num; smng name; int age; //此行是新增的 char sex; public: void display() { cout<<"num:"<<num<<endl; cout<<”nameI"<<name<<endl; cout<<"age:”<<age<<endl; //此行是新增的 cout<<"sex:"<<sex<<endl; } }; student stud;注意:虽然类中的数据成员改变了,成员函数display的定义改变了,但是类的对外接口没有改变,外界仍然通过公用的display函数访问类中的数据。程序中其他任何部分均无需修改。当然,类的功能改变了,在调用stud对象的display时,输出该学生的学号、姓名、年龄和性别的值。
可以看出:当接口与实现(对数据的操作)分离时,只要类的接口没有改变,对私有实现的修改不会影响程序的其他部分。对用户来说,类的实现方法的改变,不会影响用户,只要保持类的接口不变即可。譬如,软件开发商想对以前提供给客户的类库进行修改升级,只要保持类的接口不变,即用户调用成员函数的方法(包括函数参数的类型和个数)不变,用户的程序就不必修改。(2)如果在编译时发现类中的数据读写有错,不必检查整个程序,只需检查本类中访问这些数据的少数成员函数。这样,就使得程序(尤其是大程序)的设计、修改和调试都显得方便简单了。