1.21 有关对象的思考
下面要开始介绍面向对象。面向对象是观察世界和编写计算机程序的自然方式。
那么,为什么不从一开始就介绍面向对象呢?我们为什么要把面向对象放到第6章再介绍呢?原因是我们要建立的对象是由各个结构化程序段组成的,因此先要介绍结构化编程基础。
前面五章先介绍结构化编程的传统方法。然后在每一章的最后介绍面向对象。第一章要介绍基本概念(如“有关对象的思考”)和术语(如“对象表达”)。第2章到第5章考虑更实质的问题,然后用面向对象设计 (object-oriented design, OOD) 技术攻克难题。我们将分析建立系统时的典型问题语句,确定实现系统需要哪些对象、对象需要哪些属性、表示哪些行为以指定对象之间如何交互,以满足系统的需要。我们用实际问题而不是课堂例子来介绍这些内容,而且是在编写面向对象的C++程序之前介绍。第6章就可以开始在C++中编写面向对象的系统。
我们首先介绍一些面向对象的关键术语。看看实际生活中,对象无处不在,人、动物、植物、汽车、飞机、大楼、计算机都是对象,我们通过对象来思考问题。我们有较高的抽象(abstrction)能力。可以将屏幕图形作为人、飞机、树、山等对象,而不是各个颜色点(称为像素)。我们能看到沙滩而不是一粒粒沙子,森林而不是一棵棵树,房子而不一块块砖。
我们经常把对象分为两类:活动对象与非活动对象。活动对象是运动的,可以活动与工作。而非活动对象(如毛巾)则不能做什么事,只能静止在某处。但所有这些对象却有一些共同之处,即具有尺寸、形状、颜色、重量等属性(attribute),并具有一些行为(behavior)如球可以滚动、跳动、收缩和膨胀;婴儿会哭、会睡、会爬、会跑、会眨眼;汽车能加速、刹车、转向;毛巾能吸水等等。
人们通过观察对象属性和行为而了解对象。不同对象可能有相似的属性和行为。例如,可以比较婴儿与成人,比较人与猩猩。汽车、卡车、货车和轻便小客车也有一些相似之处。
面向对象编程 (object oriented programming,OOP) 用软件对象模拟实际对象。它利用类(class)关系,其中某一类的对象(如汽车类)有一些共同特性。它利用继承(inheritance)关系,还可以用多重继承(multiple inheritance)从现有类派生新类,并在新类中增加独特的特征。敞蓬车类对象有一些汽车类的属性,但敞蓬车的车顶可以打开、关闭。
面向对象编程可以更自然、更直观地浏览编程过程,即构造现实对象、其属性和行为。OOP还构造对象之间的通信,就像人与人之间可以互相发送信息一样(如军官命令士兵立正),对象也可以通过消息互相互通信。
OOP 将数据(属性)和函数(行为)封装(encapsulate)成对象(object),对象的数据和函数是密切联系的。对象具有信息隐藏(infomation hiding)属性,即对象虽然通过定义接口(interface)能够相互通信,但该对象通常不知道其它对象的实现方法,因为实现细节隐藏在对象内部。显然,我们可以很好地驾驶汽车而不需要知道发动机、传送系统和燃料系统内部如何工作。稍后将会介绍信息隐藏对于出色的软件工程是何等重要。
在C语言和其它过程式编程语言(procedural programming language)中,编程是面向操作的(action-oriented);而在C++中,编程是面向对象的(object-oriented)。在C语言中,编程单位是函数(function);而在C++中,编程单位是类(class),通过类可以最终实例化(即生成)对象。C++类包含函数。
C语言程序员将精力更多地放在编写函数上。完成相同任务的一组操作组成了函数,而一些函数又组成了程序。C语言中的数据虽然很重要,但数据只是用于支持函数所要完成的操作。系统中的动词(verb)帮助C语言程序员确定一组函数,这组函数一起组成系统。
C++程序员则要集中考虑生成自己的用户定义类型(称为类)。每个类包含数据和一组操作数据的函数 。类的数据组件称为数据成员(data member),而类的函数组件称为成员函数(在其它面向对象编程语言中通常称为方法)。内部类型(如int)的实例称为变量,而用户自定义类型(即类)的实例为对象。程序员用内部类型作为构造用户自定义类型的基本组件。C++中关注的重点是类(构成对象的类)而不是函数。系统中的名词(noun)帮助C++语言程序员确定一组类,由这些类生成系统的对象。对象的类就像房子的蓝图,我们可以用一张蓝图建造多个房子,同样也可以用一个类生成多个对象。
软件打包成类时,这些类变成组件,可以在今后软件系统中复用。就像房地产代商告诉客户影响房地产价位的三个主要因素是“地段、地段和地段”,同样,影响今后软件开发的三个最主要因素是“复用、复用和复用”。
事实上利用对象技术,今后大多数软件都是组合“标准化、可互换组件”的类而生成,本书介绍如何建立可复用类。每个新类都是宝贵的软件资源,可以用于加速和提高今后的软件开发速度。
本章介绍了一个C++控制结构 if 结构。第2章将介绍六个其他控制结构,介绍如何组合控制结构与各种操作语句,形成结构化程序。我们将会发现只需要三种不同的控制结构,这些结构只要用两种不同组合方式就可以形成任何以C++程序。第2章末尾我们将继续介绍面向对象,确定实际系统中需要实现的对象。