本书系统地介绍了标准C++和面向对象程序设计的思想与实现。全书共分18章:前两章简要地介绍了C++语言及其相关的基础知识;第3章到第16章详细地分析、阐述了C++语言的本质特性和设计思想;第17章介绍了C++的一些高级特性,如运算符重载、模板和异常处理等内容;第18章讲述了一些图形用户界面(GUI)的相关知识。
本书概念清晰,分析透彻,内容通俗易懂,既可作为高等院校计算机及相关专业的教材,又可供程序员和编程爱好者参考使用。
第1章 简介
1.1 什么是计算机
1.2 什么是编程
1.3 计算机剖析
1.4 将可读程序转换成机器代码
1.5 编程语言
1.6 编程语言的设计和发展
1.7 熟悉计算机
1.8 编译一个简单的程序
1.9 错误
1.10 编译过程
1.11 算法
本章小结
参考文献
习题
编程习题
第2章 基本数据类型
2.1 数字类型
2.2 输入和输出
2.3 赋值
2.4 常量
2.5 算术运算
2.6 字符串
本章小结
参考文献
习题
编程习题
第3章 对象
3.1 构造对象
3.2 使用对象
3.3 现实世界对象
3.4 显示图形
3.5 图形结构
3.6 选择坐标系统
3.7 从图形窗口获得输入
3.8 比较可视化和数字化信息
本章小结
参考文献
习题
编程习题
第4章 基本控制流程
4.1 if语句
4.2 if-else语句
4.3 关系运算符
4.4 输入确认
4.5 简单循环
4.6 处理一组输入
4.7 使用布尔变量
本章小结
参考文献
习题
编程习题
第5章 函数
5.1 如同黑箱的函数
5.2 编写函数
5.3 函数注释
5.4 返回值
5.5 参数
5.6 副作用
5.7 过程
5.8 引用参数
5.9 变量作用域和全局变量
5.10 逐步求精
5.11 从伪代码到代码
5.12 走查
5.13 前提条件
本章小结
参考文献
习题
编程习题
第6章 类
6.1 发现类
6.2 接口
6.3 封装
6.4 成员函数
6.5 默认构造函数
6.6 带参数的构造函数
6.7 访问数据成员
6.8 成员函数和非成员函数的比较
6.9 分块编译
本章小结
参考文献
习题
编程习题
第7章 高级控制流
7.1 多路分支
7.2 嵌套分支
7.3 布尔运算
7.4 德摩根定律
7.5 for循环
7.6 do_while循环
7.7 嵌套循环
7.8 处理文本输入
7.9 模拟
本章小结
参考文献
习题
编程习题
第8章 测试和调试
8.1 单元测试
8.2 选择测试用例
8.3 测试用例评价
8.4 断言
8.5 程序跟踪
8.6 调试器
8.7 策略
8.8 调试器的局限性
本章小结
参考文献
习题
编程习题
第9章 向量和数组
9.1 使用向量存放数据项
9.2 向量下标
9.3 向量参数和返回值
9.4 平行向量
9.5 数组
本章小结
参考文献
习题
编程习题
第10章 指针
10.1 指针和内存分配
10.2 释放动态内存
10.3 指针的常见用法
10.4 数组和指针
10.5 指向字符串的指针
本章小结
习题
编程习题
第11章 继承
11.1 派生类
11.2 调用基类构造函数
11.3 调用基类成员函数
11.4 多态
本章小结
习题
编程习题
第12章 流
12.1 读写文本文件
12.2 流类的继承层次
12.3 字符串流
12.4 命令行参数
12.5 随机存取
本章小结
参考文献
习题
编程习题
第13章 面向对象设计
13.1 软件生命周期
13.2 CRC 卡片
13.3 内聚
13.4 耦合
13.5 类之间的关系
13.6 实现关联
13.7 实例:打印发票
13.8 实例:一个学习游戏
本章小结
参考文献
习题
编程习题
第14章 递归
14.1 三角形数字
14.2 排列问题
14.3 用递归方式思考问题
14.4 递归辅助函数
14.5 相互递归
14.6 递归的效率
本章小结
习题
编程习题
第15章 排序和查找
15.1 选择排序
15.2 选择排序算法的测量
15.3 选择排序算法的性能分析
15.4 归并排序
15.5 分析归并排序算法
15.6 查找
15.7 折半查找
15.8 排序和查找真实数据
本章小结
参考文献
习题
编程习题
第16章 数据结构介绍
16.1 链表
16.2 实现链表
16.3 栈和队列
16.4 其他标准容器
16.5 标准算法
本章小结
参考文献
习题
编程习题
第17章 C++高级主题
17.1 运算符重载
17.2 自动内存管理
17.3 模板
17.4 嵌套类与名字空间
17.5 异常处理
本章小结
参考文献
习题
编程习题
第18章 图形用户界面
18.1 wxWindows工具包
18.2 框架
18.3 在窗口中添加文本控件
18.4 菜单
18.5 事件处理
18.6 布局管理
18.7 绘图
18.8 鼠标事件
18.9 对话框
18.10 一个完整的例子
本章小结
习题
编程习题
附录A C++语言编码指南
附录B C++语言和类库摘要
术语表
C++语言是一门十分精巧的程序设计语言。1998年,ANSI/ISO C++语言标准正式发行,赋予了C++语言更多的语言特性和更强的生命力。目前,C++语言是业界广泛使用的程序设计语言之一。
本书并不试图对C++的所有特性进行介绍,而是通过对ANSI/ISO C++语言的常用语法和大部分特性进行通俗易懂的介绍,从而清晰地说明面向对象程序设计的思想。本书不同于以往的C++书籍,其显著特点是十分注重总结归纳,在每一章中都包含“常见错误”、“开发效率提示”、“质量忠告”、“高级主题”和“背景知识”等方面的介绍和说明。“常见错误”指出了在C++编程中容易落入的陷阱和初学者易犯的错误,并提醒读者注意;“质量忠告”给出了高质量C++程序设计的方法与技巧;“高级主题”则对C++语言以及面向程序设计中的一些高级特性进行详尽地介绍;“开发效率提示”向读者讲述如何更有效地使用计算机和软件,而这对初学者十分有用;“背景知识”给出了与主题相关的背景介绍,有助于读者更好地理解相关内容。此外,本书还介绍了与程序设计密切相关的软件测试与调试方法和技巧,一种常用的面向对象设计方法:CRC方法,以及图形用户接口编程,并在附录中给出了业界广泛使用的C++语言编码指南的简化版本,这些对于初学者是非常有帮助的。
本书尽管未详尽地介绍ANSI C++的全部特性,但是却教给读者怎样以程序员的方式去思考和解决问题。因此,本书不仅是一本非常好的学习C++语言的教材或参考书,同时也适合于在工程项目中使用C++语言开发程序的程序员参考使用。
本书作者Cay Horstmann教授从1987年至今,一直在美国圣何塞州立大学计算机科学系从事C++和Java等面向对象程序设计语言的教学和科研工作,并且出版了10多本著作,同时具有非常丰富的教学实践经验。在其个人站点http://www.horstmann.com上,可以找到Cay Horstmann教授的个人简介以及与本书相关的详尽信息,包括书中的源代码、电子讲义、勘误表等。
本书由晏海华、蔡旭辉、杨春河、李沁、刘方毅、卢祺、蔺慧丽和李鹏等翻译,并由晏海华和蔡旭辉审校。
由于时间关系及水平所限,翻译不当或错误可能在所难免,恳请读者指正和见谅。
本书运用现代工具对计算机科学进行传统的介绍。作为计算机领域的科学家,很幸运能够给学生介绍一种易于实践、使人满足并且需要不断深入才能掌握的活动,即编程。正如大多数计算机科学家一样,我相信编程始终是计算机科学的核心主题。因此,本课程的目的是教学生怎样编写程序。
虽然本书在形式上保持了传统风格,但也使用了许多新技术,主要表现在三个方面:
● 所用的编程语言是一个C++子集。虽然将C++作为一门完美的教学语言还相去甚远,但其本身是一门十分注重实效的语言。在软件界中,C++是应用十分广泛的编程语言。在所有主要平台上都有便于使用的C++编程环境。特别是,C++在介绍编程思想方面具有极大优势。本书通过使用标准C++语言的新特性,如引用参数、流库、string类以及vector模板,从而最大限度地避免使用易于出错的程序结构。指针也只主要应用在多态和链表的实现上。
● 较早引入对象。本书分两个阶段介绍对象。从第2章开始,学生开始学习使用对象,特别是流对象、字符串对象、简单的Time和Employee类实例以及图形对象。本书按照传统方式逐步地介绍分支、循环、函数和过程,并在这一过程中使学生逐渐了解对象、调用成员函数等概念。然后,在第6章开始学习如何实现类和成员函数。
● 可选图形编程。学生一般都喜欢图形编程,本书包括很多可视化信息的练习。为此,本书使用一个在许多流行平台上都可以得到的简单图形库。与传统的图形库不同,该库在对象使用上更加直接、有效。该简单图形库的使用同样是可选的。此外,在第18章中通过使用一个类似于Microsoft基本类库(MFC)的开放源代码工具包来介绍图形用户界面编程。
编程语言的选择对于任何介绍程序设计的书籍来说是很重要的。然而,本书编写的目的是介绍计算机程序设计思想,而不是C++语言的全部细节。C++只是用来作为介绍计算机程序设计基本思想的工具。
本书的教学结构
在每一章的开始处,都有对本章目标和编写目的的简单介绍。在各章节中,共有五种类型的注释帮助学生理解重点内容,即“常见错误”、“开发效率提示”、“质量忠告”、“高级主题”和“背景知识”。注释使用特殊的标记,不会打乱正文的结构。教师可以在课堂上讲解注释中的一小部分,而将大部分内容留给学生课外阅读。有些注释很短,而有些则超过一页。对于这些注释,都用足够的篇幅进行详尽的解释,而不是将其压缩到一个段落中。
● “常见错误”列出了学生常犯的错误,并揭示出现这些错误的原因,以及怎样避免它们。大多数学生会主动地查看常见错误中的内容。
● “质量忠告”介绍了一些好的编程实践。这些经验的获得需要花费一定精力,注释揭示了忠告背后的原因以及为什么使用它们能够得到回报。
● “开发效率”将向学生讲述如何更有效地使用工具。很多初学者很少会仔细考虑如何更好地使用计算机和软件。他们通常不熟悉键盘快捷键、全文查找和替换,以及用脚本自动实现的某些常用任务。
● “高级主题”介绍了一些不是必须掌握但是更难理解的知识。其中的一些话题介绍了并非必要的可选句法。教师和学生可以按自己的兴趣、爱好自由选择应用它们。但是根据经验,许多学生喜欢按照“简单即好”的原则来进行选择,因为这样做可以大大减少并非必要的决策。
● “背景知识”介绍了一些计算技术方面的历史和社会信息,这不仅是为了符合ACM课程指南中“历史和社会关系”的要求,而且也是为了对高级计算机科学主题有大致的了解。学生可以在课前自己阅读这些背景知识。
本书中大多数范例程序都是完整的,并可以直接运行。教师可以将范例程序的电子版分发给学生。
附录A是本书使用的程序设计风格指南。对于所有的程序,使用一致的风格将会受益匪浅。这种风格因人而异。如果读者对特定的表示存在看法,或者个人习惯与本书的风格不同,那么读者可以自行改变这种风格。
附录B包含本书所涉及到的全部语法总结,以及所有库函数和类的文档。
本版新增内容
为了可以尽早地介绍类的实现,本书对控制流一章进行了重组。第4章涵盖了分支和循环的基本知识。第5章和第6章运用这些知识构造函数和类。最后,第7章介绍了高级控制流,如嵌套分支和可选循环结构。
在面向对象设计一章中增加了对统一建模语言(UML)的介绍。
在数据结构一章中增加了对标准模板库(STL)中容器和算法的介绍。
本书新增了一章介绍高级C++主题,其中包括运算符重载、模板、析构函数、复制构造函数、赋值运算符、嵌套类、名字空间以及异常处理。
同时,本书还新增了一章介绍递归。该章将以前分散在不同章节中的递归例子都集中起来统一处理。
本书将指针作为单独一章介绍,并将重点放在如何运用指针来对对象关系建模。但是,为了满足钻研实现细节的读者的需要,本书专设一节来讨论数组/指针的二重性关系。
在本书第二版中,在控制流、数组和继承等章节中的几个重要小节依赖于图形库。在新版中,去掉了这些依赖关系。在本书中,图形库完全是可选的。
最后,本书新增了一章介绍图形用户接口编程,主要介绍如何在实际的类库中实现类和继承。
本书的结构
本书的内容超出了一个学期的正常授课量,所以教师可以根据需要从中选择相关章节进行讲述。本书的核心内容有:
第1章 简介
第2章 基本数据类型
第3章 对象
第4章 基本控制流
第5章 函数
第6章 类
第7章 高级控制流
第9章 向量和数组
注意,第3章中的图形库是可选的。
如果课程中涉及继承和面向对象设计的内容,还应该包括:
第10章 指针
第11章 继承
第12章 流
第13章 面向对象设计
下面几章介绍了算法和数据结构。
第14章 递归
第15章 排序和查找
第16章 数据结构介绍
可以从下面两章中选择一章作为本课程的结束内容。
第17章 高级C++主题
第18章 图形用户接口
图1给出了各章节间的相互关系。
ACM 课程
本书涵盖了CC2001课程指南中的以下知识点:
PF1: 基本程序设计构造(9/9学时)
PF2: 算法和问题解决(6/6学时)
PF3: 基本数据结构(6/14学时)
PF4: 递归(3/5学时)
PF5: 事件驱动程序设计(2/4学时)
AL1: 基本算法分析(2/4学时)
AL3: 基本计算算法(2/12学时)
PL1: 程序设计语言概述(1/2学时)
PL3: 语言翻译介绍(1/2学时)
PL5: 抽象机制(2/3学时)
PL6: 面向对象程序设计(8/10学时)
SP2: 计算技术的社会环境(1/3学时)
SP5: 计算机系统的风险和责任(1/3学时)
SE3: 软件环境和工具(1/3学时)
SE6: 软件确认(2/3学时)
网络资源
与本书相关的信息可以从网站http://www.wiley.com/college/horstmann 上得到,这些资源包括:
● Employee和Time类的源代码,以及可选图形库
● 本书所有例子的源代码
● 部分习题的参考答案(可供学生使用)
● 本书所有习题的答案(只供教师使用)
● 实验手册
● 常见问题列表
● 常用编译器帮助
● 教学幻灯片
● 电子版的编程风格指南(附录A,教师可根据自己的习惯修改使用)