C++面向对象程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 面向过程与面向对象程序设计

1.面向过程程序设计

早期计算机程序的规模较小,主要开发方式为个人设计、个人使用,没有组织原则,只需将相应的程序代码组织在一起,再让计算机执行它就可以完成相应的程序功能。随着计算机技术的发展和应用的普及,程序的规模和复杂度越来越大,到了20世纪60年代初期,个人软件开发方式已不能满足要求,出现了许多问题,如软件开发费用超出预算,不能按期完成软件开发,质量达不到要求,软件维护困难等,这就是所谓的软件危机。

软件危机表明个人手工编程方式已经跟不上软件开发的需求了,迫切需要改变软件的生产方式,提高软件生产率。20世纪60年代末产生了影响深远的结构化程序设计(Structure Programming,SP)思想。结构化程序设计采用“自顶向下、逐步求精、模块化”的方法进行程序设计。即采用模块分解、功能抽象、自顶向下、分而治之的方法,将一个复杂、庞大的软件系统分解成为许多易于控制、处理、可独立编程的子任务、子模块。各模块由顺序、分支、循环三种基本结构组成,每个模块则由结构化程序设计语言的子程序(函数)实现。其基本特点是:① 按层次结构组织模块;② 每个模块只有一个入口,一个出口;③ 代码和数据分离,即“程序=数据结构+算法”。

在进行结构化程序设计时,首先将要解决的问题分解成若干个功能模块,再根据模块功能设计一系列用于存储数据的数据结构,并编写一些函数(或过程)对这些数据进行操作,最终的程序是由许多函数(或过程)组成的。

结构化程序设计是一种面向过程的程序设计方法,把数据和过程分离为相互独立的程序实体,用数据代表问题空间的客体,表达实际问题中的信息;程序代码则是用于体现和加工处理这些数据的算法。在设计软件时,必须时时考虑所要处理数据的结构和类型,对于不同格式的数据要做相同的处理,或者对于相同格式的数据要做不同的处理,都必须编写不同的程序,代码的可重用性较差。

此外,代码和操作过程的分离还会导致程序的可维护性也较差。其原因是它把数据和处理数据的过程(函数)分为两个独立的部分,当数据结构改变时,所有与之相关的处理过程都要进行修改,增大了程序维护的难度。

例如,假设实现一个通信录管理软件,程序员编写了4个函数:InputData,SearchPhone,PrintData,SearchAddr,分别用于实现通信录数据的输入、输出和数据查询功能。许多技术都可以实现通信录的数据存取,如数组、链表、队列或堆栈等,本例中采用数组存取数据。

struct Person{   //用于存放个人信息的数据结构
   char name[10];
   char addr[20];
   char phone[11];
}
Person p[100];   //保存所有个人信息的全局数组
int n=0;    //用于保存实际人数的全局变量
void InputData(){……}  //初始化全局数组P,读入每个人的姓名、地址和电话
void SearchAddr(char *name){……} //根据姓名查找地址
void SearchPhone(char *name){……} //根据姓名查找电话号码
void PrintData(){……}    //打印输入每个人的姓名、地址和电话

这4个函数通过全局数组(即P)共享数据,并且相互影响。如果将这些函数提供给其他程序员使用,就必须让该程序员知道他不能定义和修改全局数组(即P),只能通过这4个过程存取全局数据P。

个人通信录管理程序代表了面向过程的编程方法:先定义一些全局性的数据结构,然后编写一些过程对这些数据结构进行操作,其模型如图1-1所示。

图1-1 结构化程序设计模型

从图1-1的程序模型可以看出,数据和函数之间存在潜在的连接关系。某个全局数据的修改可能会引起大量操作该全局数据的函数的修改。此外,若某个函数意外修改了某个全局数据,很可能引起程序数据的混乱。例如在个人通信录管理程序中,Person的变化会引起操作它的所有函数(如InputData()、SearchAddr()等)的修改。此外,谁也没有办法限制其他程序员定义与全局数据同名的变量(如数组P),也不能限制他修改全局数组的值。当程序规模较大时,这个问题尤其突出,软件维护困难。

支持结构化程序设计的高级语言称为结构化程序设计语言,提供了顺序、分支和循环三种基本结构,支持面向过程的程序设计。C、Fortran、BASIC、Pascal、Foxpro等都是当前仍在广泛使用的面向过程的程序设计语言。

2.面向对象程序设计

随着计算机技术的发展,软件应用的领域更加广泛,软件的规模和复杂度越来越大,软件更新的速度更快,面向过程程序设计技术已不能满足软件开发在效率、代码共享和更新维护等方面的需求了,取而代之的是面向对象的程序设计技术。

面向对象程序设计的基本观点是:计算机求解的都是现实世界中的问题,它们由一些相互联系并且处于不断运动变化的事物(即对象)组成,每个事物都可以通过两方面来刻画:描述事物状态的数据和描述事物行为的函数,应该把它们结合成一个整体,代表一个客观事物,这个整体就是对象。

可以看出,一个对象由数据和函数两部分构成。数据常被称为数据成员,函数则被称为成员函数。一个对象的数据成员通常只能通过自身的成员函数修改。对象真实地表达了客观事物,它将数据和操作数据的过程(函数)绑在一起,形成一个相互依存、不可分离的整体(即对象),从同类对象中抽象出共性,形成类。同类对象中的数据原则上只能用本类提供的方法(成员函数)进行处理。

面向对象程序技术能够实现对客观世界的真实模拟,反映出世界的本来面目。从客观世界中抽象出一个个对象,对象之间能够传递消息(一个对象向其他对象发出的服务请求信息),并通过特定的函数进行数据访问,禁止以任何未经允许的方式修改对象的数据,这就是面向对象程序设计的基本模式,如图1-2所示。

图1-2 面向对象程序设计的程序模型

面向对象程序技术提高了软件的重用性、灵活性和扩展性,且使软件具有更好的可维护性。因为某类对象数据的改变只会引起该类对象程序代码的改变,而与其他类型的对象无关,这就把程序代码的修改维护局限在了一个很小的范围内。由于数据和操作它的函数是一个整体,因此易被重用。在扩展某个对象的功能时,不用考虑它对其他对象的相互影响,软件功能的扩展更容易。