6.1.2 抽象和封装
图 6.1 C++模块结构图
面向过程的程序设计是基于功能分析的,我们最关心的是如何实现一个模块的功能以及如何使用这个模块,至于模块内部的结构,对其他模块来说是不重要的,完全可隐藏的。对函数而言,这个道理同样适用,在第2章主函数一节中提到了函数由函数头和函数体两部分组成,而函数头定义了函数和调用它的函数之间的接口。
在C++程序中,函数可以看成一个封装体,将一系列相关的与实现某一功能的代码封装起来,并提供了一个使用方法(程序中常称接口),通过该接口可以在程序的任何地方使用这些代码完成特定功能,至于函数是如何编写的,可能并不是用户关心的重点,用户真正关心的是这个函数如何使用。
这种抽象和封装机制是程序设计的精髓所在,通俗地讲,假设我们要做一个木推车,用木料做车板、做车轮是最基本的做法,要求有一定的木工基础,但如果手头上已经有现成的车轮和车板可以用呢?只要组装在一起就好了,制作的难度会大大降低。我们可以让有一定木工基础的人做一批车轮,用的时候拿来安装就好了,我们关心的是如何用车轮(比如车轮的半径和车轮轴的大小等),而不是如何做车轮。
在这里,将C++程序比作手推车,木料可以理解为程序中的语句,我们可以不使用模块或函数,只通过语句,用一个main()函数来完成任务,但这是个笨法子,而且要求编程者有一定能力,不会轻易被像乱麻一样的流程弄迷糊,车轮可理解成C++中的模块或函数,把实现特定功能的代码封装在函数中,提供使用接口,在需要的时候我们只要调用模块或函数,不用再把同样的代码重写一遍,有效地提高了程序设计的效率,降低了难度。
还可以使用别人写好的函数,不必知道函数是如何写的,只要知道函数如何调用,C++的标准库函数就是实例。在第3章中介绍了运用C风格字符串处理函数,如返回字符串长度的strlen()函数,只要按照C++语言规则对函数进行声明和调用即可,不必关心其内部实现的细节。
说明
不仅有标准库函数,许多软件厂商还开发出商业化的代码库,供用户调用以实现特定的功能,模块和函数的使用在一定程度上也刺激了开发过程的商业化。
函数的本质有以下两点。
❑函数由能完成特定任务的独立程序代码块组成,如有必要,也可调用其他函数。
❑函数内部工作对程序的其余部分是不可见的。