
由于面向对象技术存在一系列突出优点,近年来这种技术越来越受到人们的重视,对它的应用和研究遍及计算机的各个领域,绝大多数高校都开设了“面向对象程序设计”之类的课程。本书总结了编者多年来从事面向对象程序设计教学和软件开发的经验体会,在授课讲稿和科研记录基础上经过精心修改、润色并补充了大量新材料而写成。
本书既注重系统性和科学性,又特别注重实用性。全书共15章,第1章、第2章讲述程序设计的基础知识和面向对象的基本理论,第3章通过一个面向对象的C++程序实例,讲述用面向对象方法解决实际问题的大体过程,引导读者把理论与实践紧密结合起来,并使读者在刚刚接触C++语言时就对C++程序全貌有基本了解。第4~11章从C++语言如何支持和实现面向对象理论的角度,结合典型实例分别讲述C++语言的内容。第12章从应用的角度讲述有关异常的内容,为读者将来开发更加安全实用的应用程序起到参考作用。第13章通过一个更加实用的例子,全面详细地讲述如何用面向对象的思想方法分析、设计、实现应用系统。第14章和第15章分别介绍了基于Windows的面向对象语言Visual C++(6.0版本)和Java,为读者在最常用的开发环境中用面向对象方法进行实用程序设计奠定基础。
本书力图帮助读者站在软件工程高度,树立起面向对象程序设计的新思维方法,初步掌握用面向对象程序设计技术解决实际问题的方法和步骤。
本书可作为高等院校“面向对象程序设计”课程的教材或教学参考书,也可供软件工作者和需要开发应用软件的广大计算机用户阅读参考。
第二版
本书第一版自2001年出版以来已10次印刷,颇受广大读者的欢迎,不少高校将其作为“面向对象程序设计”这门课的教材。第一版的内容主要取材于编者多年的专业积累和实践总结,经过5年多的时间,这一学科又有了不少新的发展,为了跟踪学科的发展方向,更好地为广大读者服务,编者结合多年的教学实践和软件开发经验对原书进行了认真系统的修订。
这次修订的指导思想是,保持原书系统性较强、实用性为主的原则,以更丰富的实例来做原理性的论述,做到理论与实践相结合。为了帮助读者较快地掌握好面向对象这门技术,编者对不易理解的原理采用了很多生活中通俗易懂的例子逐步讲解。
此次修订对大部分章节都进行了修改,用统一建模语言(UML)的概念与符号重新改写了讲述面向对象方法学的第2章及其他章节中的有关内容,第4章和第5章从知识点到易懂的小例子都进行了系统的修改,并且新增加了第12章和第13章。第12章从应用的角度讲述有关异常的内容,为读者将来开发更加安全实用的应用程序起到参考作用。第13章通过一个更加实用的例子,全面详细地讲述如何用面向对象的思想方法分析、设计、实现应用系统。另外,为了便于教学,此次修改对各章完整的程序进行了汇总,并在书中增加了一定数量的习题,供读者练习。
本书第1~3、6~11章由张海藩编写,第4、5、12~15章由牟永敏编写。全书最后由张海藩统一修改定稿。
张清对第二版的编写和修改提出了有益的建议,李贝在第13章的编写中提出了宝贵意见,梅锐、曹硕等同学对书中的例子和习题进行了多次测试,谨在此向他们表示感谢。
由于编者的水平有限,难免会有不足之处,我们诚恳期待读者的批评指正和建议,供以后再版时参考,使本书日臻完善。
编 者
2007年6月
第一版
长期以来,人们一直希望能够以一种自然而且方便的方式进行程序设计,软件危机出现以后这种愿望更加迫切。目前看来,面向对象的程序设计技术比较接近人们追求的目标:既有静态属性又有动态行为的对象与客观世界的实体比较相像,面向对象的程序能够比较自然地模拟客观世界,从而可以使得解空间与问题空间在结构上尽可能一致;用面向对象方法学来分析、设计和实现软件系统的过程与人们认识客观世界、解决实际问题的过程比较一致;面向对象的程序具有稳定、易理解、易修改和可重用等优点,从而可以明显提高软件开发与维护的效率,降低软件的总成本。
因此,近年来面向对象的技术越来越受到人们的重视,对它的应用和研究遍及计算机软件和硬件的各个领域,国内高校普遍开设了“面向对象程序设计”之类的课程。编者多年来一直从事软件工程和面向对象程序设计这两门相关课程的教学工作,并且用面向对象方法开发了一些软件系统。本书总结了编者教学和科研的经验体会,在授课讲稿的基础上经过精心修改、润色并补充了大量新材料而写成。
本书在编写时注重系统性和科学性,特别强调实用性。第一章讲述程序设计的基础知识,着重介绍了传统的面向过程程序设计的基本思想和原理,以及近年来逐渐流行起来的面向对象程序设计的基本思想和主要优点。第二章讲述面向对象的理论,包括基本概念,建立和描述对象模型的方法,面向对象的分析、设计和实现的方法等内容。这一章讲述的面向对象理论并不依赖于具体的程序语言和开发工具,在进行面向对象程序设计实践时,这些理论具有普遍的指导意义。但是,为了能真正用面向对象方法解决实际问题,必须使用一种具体的程序语言。从第三章起的九章中,讲述使用C++语言进行面向对象程序设计的方法。与多数讲述C++语言的书籍不同,第三章不是从C++语言的具体语法讲起,而是讲述用面向对象方法解决一个实际问题的全过程,包括需求陈述,对该问题进行面向对象分析和设计的过程,以及解决该问题的完整的C++程序。从而引导读者把理论与实践紧密地结合起来,学习运用面向对象的思维方式解决实际问题的方法,并使读者在刚刚接触C++语言时就对C++程序的全貌有基本了解。第四章至第十一章,从C++语言如何支持和实现面向对象理论的角度出发,分别讲述数据成员、成员函数、封装性、继承性、重载、多态性、I/O流和模板等内容,从而使读者不仅初步掌握用C++语言实现面向对象理论的方法,而且加深和拓宽了对C++语言及程序的理解。
第十二章和第十三章分别介绍了基于Windows的面向对象语言Visual C++(6.0版)和Java,为读者在最常用的开发环境中用面向对象方法进行实用程序设计奠定了基础。特别是第十二章再次通过一个实例,系统地讲述了用面向对象方法解决实际问题的全过程,强调了利用MFC类库进行可重用的程序设计的必要性,对读者学习面向对象程序设计的新思维和新方法是很有帮助的。
本书的目的不是单纯地讲述某些面向对象的程序设计语言,而是把这些语言作为运用面向对象理论解决实际问题的工具,力图帮助读者站在软件工程的高度,树立起面向对象程序设计的新思维,初步掌握运用面向对象程序设计技术解决实际问题的方法和步骤。
本书第一、二、三、六、七、八、九、十、十一章由张海藩编写,第十二章由张海藩和牟永敏共同编写,第四、五、十三章由牟永敏编写。全书最后由张海藩统一修改定稿。
杨秀梅曾对本书编写工作提出过一些有益的建议,张劲松和张展新编写了第十二章l2.5节中讲述的程序,刘淋、周弘、丰莎莎、张雯、张杰、金龙哲、王春杰、徐乃忠、龚虹杰、于剑、张建、侯恭羽等人完成了本书一些具体工作,谨在此向他们表示感谢。
本书第三章至第十一章的示例程序已经用Borland C++ 3.0调试通过,第十二章的示例程序用Visual C++ 6.0调试通过,第十三章的示例程序用SUN JDK 1.2调试通过。
本书中如有不当之处,欢迎广大读者批评指正。
编 者
2001年2月
目 录
第1章 计算机与程序设计 1
1.1 计算机的基本结构 1
1.1.1 计算机硬件的基本组成 1
1.1.2 计算机的工作过程 4
1.2 程序设计语言 5
1.3 面向过程程序设计 8
1.3.1 模块化 8
1.3.2 抽象 9
1.3.3 信息隐藏和局部化 10
1.3.4 模块独立 10
1.3.5 结构程序设计技术 11
1.4 小结 12
习题 13
第2章 面向对象方法学引论 14
2.1 面向对象方法学概述 14
2.1.1 面向对象方法学导论 14
2.1.2 面向对象方法概述 15
2.1.3 面向对象方法的主要优点 17
2.1.4 喷泉模型 20
2.2 面向对象的概念 21
2.2.1 对象 21
2.2.2 其他概念 24
2.3 面向对象建模 27
2.4 对象模型 29
2.4.1 类图的基本符号 29
2.4.2 表示关系的符号 31
2.5 动态模型 35
2.5.1 状态 35
2.5.2 事件 36
2.5.3 符号 36
2.5.4 例子 37
2.6 功能模型 38
2.6.1 用例图 38
2.6.2 用例建模 40
2.7 3种模型之间的关系 41
2.8 小结 42
习题 43
第3章 一个面向对象的C++程序实例 44
3.1 面向对象分析与设计 44
3.1.1 需求陈述 44
3.1.2 面向对象分析 44
3.1.3 面向对象设计 45
3.2 用C++实现 47
3.2.1 定义类 48
3.2.2 声明数据成员 49
3.2.3 声明和定义成员函数 50
3.2.4 完整的C++程序 51
3.2.5 运行C++程序 55
3.3 小结 56
习题 57
第4章 数据成员 58
4.1 数据类型 58
4.1.1 基本数据类型 58
4.1.2 复合数据类型 61
4.1.3 指针和引用 65
4.2 const数据成员 72
4.3 静态数据成员 73
4.4 动态数据成员与对象生存期 75
4.4.1 动态数据成员 75
4.4.2 对象生存期与数据成员作用域 77
4.5 小结 78
习题 79
第5章 成员函数 81
5.1 成员函数的概念 81
5.2 算法描述 81
5.2.1 算法的概念 81
5.2.2 算法的表示 82
5.3 成员函数的定义与调用 83
5.3.1 成员函数的定义 83
5.3.2 成员函数的调用 84
5.3.3 函数指针与回调函数 85
5.3.4 内联函数 88
5.4 运算符和表达式 89
5.4.1 运算符及运算符优先级 89
5.4.2 表达式 91
5.4.3 数据类型的转换 94
5.5 控制结构 96
5.5.1 顺序结构 96
5.5.2 选择结构(又称分支结构) 96
5.5.3 循环结构 101
5.5.4 递归 106
5.6 函数参数的传递机制 107
5.6.1 值调用 107
5.6.2 引用调用 109
5.7 函数的参数 110
5.7.1 函数参数的求值顺序 110
5.7.2 数组作为函数参数 111
5.7.3 带默认值的函数 113
5.8 静态成员函数 114
5.9 函数的重载 115
5.10 两种特殊函数 117
5.10.1 构造函数 117
5.10.2 析构函数 118
5.11 用计算机求解智力游戏 118
5.12 小结 119
习题 120
第6章 封装性 123
6.1 C++中的类与对象 123
6.1.1 定义类的语法 123
6.1.2 定义类的例子 125
6.1.3 声明和使用对象 127
6.2 封装的好处 129
6.3 对象成员 132
6.4 const对象和const成员 134
6.4.1 const对象和只读成员函数 134
6.4.2 const对象成员 135
6.5 对象数组 136
6.6 自引用指针(this) 138
6.7 友元 141
6.8 小结 144
习题 145
第7章 继承性 147
7.1 继承的好处 147
7.2 C++定义派生类的语法 150
7.2.1 定义派生类的语法 150
7.2.2 访问权修饰符 150
7.3 基类成员的访问属性 152
7.3.1 同名成员 152
7.3.2 静态成员 154
7.3.3 访问声明 156
7.4 派生类对象的初始化 159
7.5 多重继承 161
7.5.1 语法 161
7.5.2 同名引出的二义性 162
7.5.3 公共基类带来的二义性 163
7.5.4 虚基类 165
7.6 基类与派生类之间的转换 167
7.6.1 赋值兼容规则 168
7.6.2 赋值兼容规则应用举例 169
7.7 小结 171
习题 172
第8章 重载 175
8.1 重载的好处 175
8.2 对运算符重载的限制 178
8.3 运算符重载的语法 180
8.3.1 用成员函数重载运算符 180
8.3.2 用成员函数重载运算符之例 181
8.3.3 用友元函数重载运算符 184
8.3.4 用友元函数重载运算符之例 184
8.4 重载赋值运算符 187
8.4.1 指针悬挂问题 187
8.4.2 重载赋值运算符解决指针悬挂问题 189
8.5 重载++和- -运算符 190
8.6 重载运算符的规则 191
8.7 类类型转换 193
8.7.1 用构造函数完成类类型转换 193
8.7.2 类类型转换函数 195
8.8 小结 197
习题 198
第9章 多态性 202
9.1 静态联编与动态联编 202
9.1.1 静态联编 202
9.1.2 动态联编 205
9.2 虚函数的声明与使用 206
9.2.1 声明虚函数 206
9.2.2 使用虚函数 207
9.2.3 动态联编的实现 209
9.3 虚函数应用实例之一 210
9.4 纯虚函数 212
9.5 虚函数应用实例之二 213
9.6 多态性带来的好处 218
9.7 小结 220
习题 221
第10章 I/O流 224
10.1 C++流库概述 224
10.2 预定义类型的输入/输出 226
10.2.1 istream流类 226
10.2.2 ostream流类 227
10.2.3 输入运算符 227
10.2.4 输出运算符 229
10.3 格式控制 230
10.3.1 用ios类成员函数控制格式 230
10.3.2 用控制符控制格式 233
10.4 自定义类型的输入/输出 236
10.4.1 重载输入运算符 236
10.4.2 重载输出运算符 237
10.5 文件的输入/输出 238
10.5.1 面向文件的流类 239
10.5.2 文件的读写 240
10.6 小结 244
习题 245
第11章 模板 247
11.1 从类属到模板 247
11.1.1 无约束类属 247
11.1.2 约束类属 248
11.2 函数模板与模板函数 249
11.2.1 概念 249
11.2.2 重载 250
11.3 类模板与模板类 252
11.3.1 定义类模板 252
11.3.2 使用类模板 253
11.3.3 类模板的派生 254
11.4 模板应用实例 255
11.4.1 用类模板实现类属链表 255
11.4.2 派生出集合类模板和集合类 258
11.5 小结 259
习题 260
第12章 异常处理 262
12.1 异常的概念 262
12.2 异常处理的基本思想 262
12.3 C++异常处理的实现 263
12.3.1 异常处理的语法 263
12.3.2 异常的实现步骤与简单实例 264
12.3.3 使用异常处理机制的规则 266
12.4 异常抛出与捕获的对应关系 266
12.5 标准程序库异常处理 271
12.6 小结 273
习题 273
第13章 面向对象程序设计方法的应用实例 274
13.1 需求 274
13.2 分析 274
13.2.1 定义问题域 274
13.2.2 分析并抽象出与监测有关的类 275
13.2.3 描述与监测有关的类之间的关系 276
13.2.4 分析与抽象出与显示有关的类 277
13.2.5 分析与抽象出与运行机制有关的类 277
13.2.6 综合出系统的初步对象模型 279
13.3 设计 280
13.3.1 系统构架 280
13.3.2 系统的详细对象模型 281
13.3.3 确定机制 282
13.3.4 定义与计时器相关类 282
13.3.5 定义管理监测类的容器类 283
13.3.6 综合出系统的运行机制 285
13.3.7 制定完善细化功能模块的顺序 285
13.3.8 定义与监测有关的类 286
13.4 小结 288
习题 289
第14章 基于Windows的面向对象语言——VC++ 290
14.1 Windows的编程模式 290
14.2 Microsoft基础类库(MFC)及应用程序框架 293
14.3 Microsoft基础类库的消息映射 301
14.4 VC++的文档-视图模型 301
14.5 VC++程序设计实例 303
14.5.1 面向对象分析 304
14.5.2 面向对象设计 306
14.6 小结 311
习题 311
第15章 基于Windows的面向对象语言——Java 312
15.1 Java的特点 312
15.2 Java简介 315
15.2.1 Java中类的定义 315
15.2.2 Java类中的数据与方法 315
15.2.3 Java中的继承性 317
15.2.4 Java中的多态性 317
15.3 Java与C++的区别 318
15.4 JVM的概念与规范 320
15.4.1 JVM的概念 320
15.4.2 JVM的规范 320
15.5 Java的应用 321
15.6 小结 327
习题 327
附录A 常用库函数一览表 328
附录B ASCII码表注解 330
附录C 键盘常用键对应ASCII码 331
附录D ASCII基表 333
附录E ASCII扩展表 334
参考文献 335