《谭浩强《C++程序设计》课件 第8章》由会员分享,可在线阅读,更多相关《谭浩强《C++程序设计》课件 第8章(81页珍藏版)》请在金锄头文库上搜索。
1、第8章 类和对象 第9章 关于类和对象的进一步讨论 第10章 运算符重载第3篇基于对象的程序设计第8章 类和对象8.1 面向对象程序设计方法概述 8.2 类的声明和对象的定义 8.3 类的成员函数 8.4 对象成员的引用 8.5 类的封装性和信息隐蔽 8.6 类和对象的简单应用举例到目前为止,我们介绍的是C+在面向过程的程 序设计中的应用。对于规模比较小的程序,编程者 可以直接编写出一个面向过程的程序,详细地描述 每一瞬时的数据结构及对其的操作过程。但是当程 序规模较大时,就显得力不从心了。C+就是为了 解决编写大程序过程中的困难而产生的。8.1 面向对象程序设计方法概述面向对象的程序设计的思
2、路和人们日常生活中处 理问题的思路是相似的。在自然世界和社会生活中 ,一个复杂的事物总是由许多部分组成的。 当人们生产汽车时,分别设计和制造发动机、底 盘、车身和轮子,最后把它们组装在一起。在组装 时,各部分之间有一定的联系,以便协调工作。 这就是面向对象的程序设计的基本思路。 为了进一步说明问题,下面先讨论几个有关的概 念。8.1.1 什么是面向对象的程序设计1. 对象客观世界中任何一个事物都可以看成一个对象 (object)。对象可大可小。对象是构成系统的基本单位。 任何一个对象都应当具有这两个要素,即属性 (attribute)和行为(behavior),它能根据外界给的信 息进行相应的
3、操作。一个对象往往是由一组属性和 一组行为构成的。一般来说,凡是具备属性和行为 这两种要素的,都可以作为对象。 在一个系统中的多个对象之间通过一定的渠道相 互联系,如图8.1示意。要使某一个对象实现某一 种行为(即操作),应当向它传送相应的消息。对象 之间就是这样通过发送和接收消息互相联系的。图8.1 图8.2面向对象的程序设计采用了以上人们所熟悉的这 种思路。使用面向对象的程序设计方法设计一个复 杂的软件系统时,首要的问题是确定该系统是由哪 些对象组成的,并且设计这些对象。在C+中,每 个对象都是由数据和函数(即操作代码)这两部分组 成的,见图8.2。数据体现了前面提到的“属性”,如 一个三
4、角形对象,它的3个边长就是它的属性。函 数是用来对数据进行操作的,以便实现某些功能, 例如可以通过边长计算出三角形的面积,并且输出 三角形的边长和面积。计算三角形面积和输出有关 数据就是前面提到的行为,在程序设计方法中也称 为方法(method)。调用对象中的函数就是向该对象 传送一个消息(message),要求该对象实现某一行为 (功能)。2. 封装与信息隐蔽可以对一个对象进行封装处理,把它的一部分属 性和功能对外界屏蔽,也就是说从外界是看不到的 ,甚至是不可知的。这样做的好处是大大降低了操作对象的复杂程度 。 面向对象程序设计方法的一个重要特点就是“封 装性” (encapsulation
5、),所谓“封装”,指两方面的 含义: 一是将有关的数据和操作代码封装在一个 对象中,形成一个基本单位,各个对象之间相对独 立,互不干扰。二是将对象中某些部分对外隐蔽, 即隐蔽其内部细节,只留下少量接口,以便与外界 联系,接收外界的消息。这种对外界隐蔽的做法称 为信息隐蔽(imformation hiding)。信息隐蔽还有利 于数据安全,防止无关的人了解和修改数据。C+的对象中的函数名就是对象的对外接口,外 界可以通过函数名来调用这些函数来实现某些行为 (功能)。这些将在以后详细介绍。3. 抽象 在程序设计方法中,常用到抽象(abstraction)这 一名词。抽象的过程是将有关事物的共性归纳
6、、集 中的过程。 抽象的作用是表示同一类事物的本质。C和C+ 中的数据类型就是对一批具体的数的抽象。 对象是具体存在的,如一个三角形可以作为一个 对象,10个不同尺寸的三角形是10个对象。如果这 10个三角形对象有相同的属性和行为,可以将它们 抽象为一种类型,称为三角形类型。在C+中,这 种类型就称为“类(class)”。这10个三角形就是属于 同一“类”的对象。类是对象的抽象,而对象则是类 的特例,或者说是类的具体表现形式。4. 继承与重用 如果在软件开发中已经建立了一个名为A的“类” ,又想另外建立一个名为B的“类”,而后者与前者 内容基本相同,只是在前者的基础上增加一些属性 和行为,只需
7、在类A的基础上增加一些新内容即可 。这就是面向对象程序设计中的继承机制。利用继 承可以简化程序设计的步骤。 “白马”继承了“马”的基本特征,又增加了新的特 征(颜色),“马”是父类,或称为基类,“白马”是从“ 马”派生出来的,称为子类或派生类。 C+提供了继承机制,采用继承的方法可以很方 便地利用一个已有的类建立一个新的类。这就是常 说的“软件重用”(software reusability) 的思想。5. 多态性如果有几个相似而不完全相同的对象,有时人们 要求在向它们发出同一个消息时,它们的反应各不 相同,分别执行不同的操作。这种情况就是多态现 象。如,在Windows环境下,用鼠标双击一个
8、文件 对象(这就是向对象传送一个消息),如果对象是一 个可执行文件,则会执行此程序,如果对象是一个 文本文件,则启动文本编辑器并打开该文件。 在C+中,所谓多态性(polymorphism)是指: 由 继承而产生的相关的不同的类,其对象对同一消息 会作出不同的响应。多态性是面向对象程序设计的 一个重要特征,能增加程序的灵活性。传统的面向过程程序设计是围绕功能进行的,用 一个函数实现一个功能。所有的数据都是公用的, 一个函数可以使用任何一组数据,而一组数据又能 被多个函数所使用(见图8.3)。图8.38.1.2 面向对象程序设计的特点面向对象程序设计采取的是另外一种思路。它面 对的是一个个对象。
9、实际上,每一组数据都是有特 定的用途的,是某种操作的对象。也就是说,一组 操作调用一组数据。 程序设计者的任务包括两个方面: 一是设计所需 的各种类和对象,即决定把哪些数据和操作封装在 一起;二是考虑怎样向有关对象发送消息,以完成 所需的任务。这时他如同一个总调度,不断地向各 个对象发出命令,让这些对象活动起来(或者说激 活这些对象),完成自己职责范围内的工作。各个 对象的操作完成了,整体任务也就完成了。显然, 对一个大型任务来说,面向对象程序设计方法是十 分有效的,它能大大降低程序设计人员的工作难度 ,减少出错机会。类是C+中十分重要的概念,它是实现面向对象 程序设计的基础。类是所有面向对象
10、的语言的共同 特征,所有面向对象的语言都提供了这种类型。一 个有一定规模的C+程序是由许多类所构成的。 C+支持面向过程的程序设计,也支持基于对象 的程序设计,又支持面向对象的程序设计。在本章 到第10章将介绍基于对象的程序设计。包括类和对 象的概念、类的机制和声明、类对象的定义与使用 等。这是面向对象的程序设计的基础。8.1.3 类和对象的作用基于对象就是基于类。与面向过程的程序不同, 基于对象的程序是以类和对象为基础的,程序的操 作是围绕对象进行的。在此基础上利用了继承机制 和多态性,就成为面向对象的程序设计(有时不细 分基于对象程序设计和面向对象程序设计,而把二 者合称为面向对象的程序设
11、计)。基于对象程序设计所面对的是一个个对象。所有 的数据分别属于不同的对象。 在面向过程的结构化程序设计中,人们常使用这 样的公式来表述程序: 程序=算法数据结构算法和数据结构两者是互相独立、分开设计的, 面向过程的程序设计是以算法为主体的。在实践中 人们逐渐认识到算法和数据结构是互相紧密联系不 可分的,应当以一个算法对应一组数据结构,而不 宜提倡一个算法对应多组数据结构,以及一组数据 结构对应多个算法。基于对象和面向对象程序设计 就是把一个算法和一组数据结构封装在一个对象中 。因此,就形成了新的观念: 对象 = 算法 数据结构 程序 = (对象+对象+对象+) + 消息 或: 程序 = 对象
12、s + 消息 “对象s”表示多个对象。消息的作用就是对对象的 控制。程序设计的关键是设计好每一个对象,及确 定向这些对象发出的命令,使各对象完成相应操作 。随着软件规模的迅速增大,软件人员面临的问题 十分复杂。需要规范整个软件开发过程,明确软件 开发过程中每个阶段的任务,在保证前一个阶段工 作的正确性的情况下,再进行下一阶段的工作。这 就是软件工程学需要研究和解决的问题。 面向对象的软件工程包括以下几个部分: 8.1.4 面向对象的软件开发1. 面向对象分析(object oriented analysis,OOA) 软件工程中的系统分析阶段,系统分析员要和用 户结合在一起,对用户的需求作出精
13、确的分析和明 确的描述,从宏观的角度概括出系统应该做什么( 而不是怎么做)。面向对象的分析,要按照面向对 象的概念和方法,在对任务的分析中,从客观存在 的事物和事物之间的关系,归纳出有关的对象(包 括对象的属性和行为)以及对象之间的联系,并将 具有相同属性和行为的对象用一个类(class)来表示 。建立一个能反映真实工作情况的需求模型。2. 面向对象设计(object oriented design,OOD)根据面向对象分析阶段形成的需求模型,对每一 部分分别进行具体的设计,首先是进行类的设计, 类的设计可能包含多个层次(利用继承与派生)。然 后以这些类为基础提出程序设计的思路和方法,包 括对
14、算法的设计。在设计阶段,并不牵涉某一种具 体的计算机语言,而是用一种更通用的描述工具( 如伪代码或流程图)来描述。 3. 面向对象编程(object oriented programming, OOP)根据面向对象设计的结果,用一种计算机语言把 它写成程序,显然应当选用面向对象的计算机语言 (例如C+),否则无法实现面向对象设计的要求。4. 面向对象测试(object oriented test,OOT)在写好程序后交给用户使用前,必须对程序进行 严格的测试。测试的目的是发现程序中的错误并改 正它。面向对象测试是用面向对象的方法进行测试 ,以类作为测试的基本单元。 5. 面向对象维护(obje
15、ct oriented soft maintenance, OOSM)因为对象的封装性,修改一个对象对其他对象影 响很小。利用面向对象的方法维护程序,大大提高 了软件维护的效率。现在设计一个大的软件,是严格按照面向对象软 件工程的5个阶段进行的,这5个阶段的工作不是由 一个人从头到尾完成的,而是由不同的人分别完成 的。这样,OOP阶段的任务就比较简单了,程序编 写者只需要根据OOD提出的思路用面向对象语言 编写出程序即可。在一个大型软件的开发中,OOP 只是面向对象开发过程中的一个很小的部分。 如果所处理的是一个较简单的问题,可以不必严 格按照以上5个阶段进行,往往由程序设计者按照 面向对象的
16、方法进行程序设计,包括类的设计(或 选用已有的类)和程序的设计。每一个实体都是对象。有一些对象是具有相同的 结构和特性的。每个对象都属于一个特定的类型。 在C+中对象的类型称为类(class)。类代表了某 一批对象的共性和特征。前面已说明: 类是对象 的抽象,而对象是类的具体实例(instance)。正如同 结构体类型和结构体变量的关系一样,人们先声明 一个结构体类型,然后用它去定义结构体变量。同 一个结构体类型可以定义出多个不同的结构体变量 。8.2 类的声明和对象的定义8.2.1 类和对象的关系在C+中也是先声明一个类类型,然后用它去定 义若干个同类型的对象。对象就是类类型的一个变 量。可以说类是对象的模板,是用来定义对象的一 种抽象类型。 类是抽象的,不占用内存,而对象是具体的,占 用存储空间。在一开始时弄清对象和类的关系是十 分重要的。类是用户自己指定的类型。如果程序中要用到类 类型,必须自己根据需要进行声明,或者使用别人