本书揭示了C++程序员创建世界级软件的奥秘。程序设计大师Herbert Schildt通过将C++语言广泛应用于功能强大的编程任务中,全面展示了C++语言的多功能性,敏捷性,和艺术性。本书内容包括探索C++的功能,创建内存管理的垃圾回收器子系统,开发线程控制面板,建立译码器以扩展C++的功能,开发可断点续传的Internet文件下载工具,创建财务分析库,用基于AI的搜索技术探索人工智能,建立定制的STL容器,以及开发Mini C++解释程序。书中所有示例和项目的源代码都可以从www.osborne.com 上免费下载
第1章 C++的功能 1
1.1 简洁而丰富的语法 1
1.2 功能强大的库 2
1.3 STL 2
1.4 程序员控制一切 3
1.5 细节控制 3
1.6 运算符重载 3
1.7 一种简洁精练的对象模型 4
1.8 C++发展史 4
第2章 简单的C++垃圾回收器 5
2.1 两种内存管理方法的比较 5
2.1.1 手工内存管理的优缺点 6
2.1.2 垃圾回收的优缺点 6
2.1.3 两种方法都可以使用 7
2.2 在C++中创建垃圾回收器 7
2.3 选择垃圾回收的算法 8
2.3.1 引用计数 9
2.3.2 标记并清除 9
2.3.3 复制 9
2.3.4 采用哪种算法 9
2.3.5 实现垃圾回收器 10
2.3.6 是否使用多线程 10
2.3.7 何时回收垃圾 10
2.3.8 关于auto_ptr 11
2.4 一个简单的C++垃圾回收器 11
2.5 详细讨论GCPtr 23
2.5.1 GCPtr的数据成员 23
2.5.2 函数findPtrInfo() 24
2.5.3 GCIterator typedef 25
2.5.4 GCPtr的构造函数 25
2.5.5 GCPtr的析构函数 26
2.5.6 回收垃圾函数collect() 26
2.5.7 重载赋值运算符 28
2.5.8 GCPtr的复制构造函数 30
2.5.9 指针运算符和转换函数 30
2.5.10 begin()和end()函数 32
2.5.11 shutdown()函数 32
2.5.12 两个实用函数 33
2.6 GCInfo 33
2.7 Iter 34
2.8 如何使用GCPtr 36
2.8.1 处理分配异常 37
2.8.2 一个更有趣的示例 38
2.8.3 对象的分配和丢弃 40
2.8.4 分配数组 41
2.8.5 使用具有类类型的GCPtr 43
2.8.6 一个比较大的演示程序 45
2.8.7 加载测试 51
2.8.8 一些限制 53
2.9 试着完成下面的任务 53
第3章 C++中的多线程 54
3.1 什么是多线程 54
3.2 为什么C++没有内建支持多线程 55
3.3 选用什么样的操作系统和编译器 56
3.4 Windows线程函数概述 56
3.4.1 线程的创建和终止 56
3.4.2 Visual C++对CreateThread()和ExitThread()的替换 57
3.4.3 线程的挂起和恢复 58
3.4.4 改变线程的优先级 59
3.4.5 获取主线程的句柄 60
3.4.6 同步 60
3.5 创建线程控制面板 63
3.5.1 线程控制面板 64
3.5.2 线程控制面板的详细分析 68
3.5.3 控制面板的演示 74
3.6 一个多线程的垃圾回收器 78
3.6.1 附加的成员变量 79
3.6.2 多线程的GCPtr构造函数 79
3.6.3 TimeOutExc异常 81
3.6.4 多线程的GCPtr析构函数 81
3.6.5 gc()函数 82
3.6.6 isRunning()函数 82
3.6.7 gclist的同步访问 83
3.6.8 其他两个改变 83
3.6.9 完整的多线程垃圾回收器 83
3.6.10 多线程垃圾回收器的使用 95
3.7 试着完成下面的任务 97
第4章 C++的扩展 98
4.1 为什么使用译码器 98
4.2 实验性的关键字 99
4.2.1 foreach循环 99
4.2.2 cases语句 100
4.2.3 typeof 运算符 101
4.2.4 repeat/until循环 102
4.3 试验C++新特性的译码器 102
4.4 使用译码器 111
4.5 译码器的运行方式 112
4.5.1 全局声明 112
4.5.2 main()函数 112
4.5.3 gettoken()和skipspaces()函数 114
4.5.4 转换foreach循环 117
4.5.5 转换cases语句 119
4.5.6 转换typeof运算符 121
4.5.7 转换repeat/until循环 122
4.6 演示程序 124
4.7 尝试完成以下任务 130
第5章 Internet文件下载工具 131
5.1 WinINet库 131
5.2 文件下载工具子系统 132
5.2.1 操作的一般理论 137
5.2.2 download()函数 137
5.2.3 ishttp()函数 142
5.2.4 httpverOK()函数 142
5.2.5 getfname()函数 143
5.2.6 openfile()函数 143
5.2.7 update()函数 144
5.3 Download头文件 145
5.4 文件下载工具的演示 145
5.5 基于GUI的下载工具 147
5.5.1 WinDL代码 147
5.5.2 WinDL的运行方式 152
5.6 尝试完成以下任务 153
第6章 使用C++的财务计算 154
6.1 计算贷款的定期偿还 154
6.2 计算投资的预期价值 156
6.3 计算为了获得预期的价值所需的原始投资 157
6.4 为了获得预期的养老金所需的原始投资 159
6.5 计算给定投资所能得到的养老金的最大值 160
6.6 计算贷款余额 162
6.7 尝试完成以下任务 163
第7章 基于AI的问题求解 164
7.1 表示法和术语 164
7.2 组合爆炸 165
7.3 搜索方法 167
7.4 需要解决的问题 167
7.5 FlightInfo结构和Search类 169
7.6 深度优先搜索 171
7.6.1 match()函数 176
7.6.2 find()函数 177
7.6.3 findroute()函数 177
7.6.4 显示路线 179
7.6.5 深度优先搜索分析 179
7.7 广度优先搜索 179
7.8 添加启发信息 182
7.8.1 爬山搜索法 183
7.8.2 爬山法分析 189
7.9 最低成本搜索 189
7.10 寻找多解 190
7.10.1 路径删除 191
7.10.2 节点删除 192
7.11 寻找“最优”解决方案 198
7.12 回到丢失钥匙的问题 204
7.13 尝试完成以下任务 207
第8章 定制STL容器 208
8.1 STL的简要回顾 208
8.1.1 容器 209
8.1.2 算法 209
8.1.3 迭代器 209
8.2 其他的STL实体 209
8.3 定制容器的要求 210
8.3.1 一般要求 210
8.3.2 序列式容器的其他要求 211
8.3.3 关联式容器的要求 211
8.4 创建范围可选的动态数组容器 212
8.4.1 RangeArray的运行方式 212
8.4.2 完整的RangeArray类 213
8.4.3 详细讨论RangeArray类 224
8.4.4 一些RangeArray示例程序 235
8.4.5 尝试完成以下任务 245
第9章 Mini C++解释程序 246
9.1 解释程序和编译器 246
9.2 Mini C++纵览 247
9.3 Mini C++说明 247
9.4 非正式的C++理论 249
9.4.1 C++表达式 250
9.4.2 定义表达式 250
9.5 表达式解析器 252
9.5.1 解析器代码 252
9.5.2 分解源代码 264
9.5.3 显示语法错误 270
9.5.4 表达式求值 271
9.6 Mini C++解释程序 272
9.6.1 main()函数 291
9.6.2 解释程序的预扫描程序 292
9.6.3 interp()函数 295
9.6.4 处理局部变量 297
9.6.5 调用用户自定义的函数 299
9.6.6 给变量赋值 300
9.6.7 执行if语句 302
9.6.8 switch语句和break语句 304
9.6.9 处理while循环 306
9.6.10 处理do-while循环 307
9.6.11 for循环 308
9.6.12 处理cin和cout语句 309
9.7 Mini C++的库函数 311
9.8 mccommon.h头文件 313
9.9 编译并链接Mini C++解释程序 315
9.10 演示Mini C++ 315
9.11 改进Mini C++ 323
9.12 扩展Mini C++ 324
9.12.1 添加新的C++特性 324
9.12.2 添加辅助特性 325
本书作者Herbert Schildt,是公认的C、C++、Java和C#等主流编程语言的程序设计大师和Windows程序设计专家,也是顶级编程图书作者;同时,他还是ANSI/ISO和C++标准化组织的专家。他的编程书籍被翻译成多种语言版本广为流传,在全球世界范围内的销量已经超过三百万册。
本书的突出特点之一是编程技巧全面。本书以C++国际标准语法为基础,从高级特性全面讲解C++语言编程技术、技巧,充分展示了C++语言的强大性、多样性、优美性、敏捷性和艺术性。作者结合多年软件开发和教学经验总结出非常有价值的完整示例,以行之有效的方法让读者快速精通C++语言编程技巧。本书每章给出的示例代码都可以直接运行,无需修改,而且读者可以从www.osborne.com网站免费下载本书代码。相信读者通过研读本书可大大提高C++编程能力。
本书的突出特点之二是内容丰富实用。在本书中,Herbert Schildt给出了许多非常实用的高性能程序,每个程序分别侧重于C++语言的不同方面。本书的实用示例程序主要包括垃圾回收器子系统、可以断点续传的Internet文件下载程序、线程控制面板、基于人工智能(AI)的搜索程序、通用STL容器和小型C++解释程序等。作者对每个程序都给出了非常细致的分析和解释,这对于读者来说无疑是大有帮助的。本书代码示例易懂有趣、设计思想独特,从中读者可以学到很多在其他C++书中无法学到的技巧,使读者能够掌握C++高级编程的技巧,真正进入C++高级编程领域,值得每位C++程序员阅读和珍藏。
本书的突出特点之三是文笔透彻精确。Herbert Schildt是全球著名的程序设计语言书籍作者,本书秉承他一贯的写作风格:简捷、清晰,非常适合读者的学习和阅读。通过本书的阅读,读者可在C++程序设计大师的引领下探索编写高性能C++程序的奥秘。本书让读者的C++编程技术更上一层楼。
本书为C++编程高级读物,面向有初级C++语言基础和一定编程经历的程序设计者,适合作为高等院校计算机专业相关课程辅助教材,也可作为高年级本科生、研究生和广大编程爱好者深入学习C++及其他面向对象语言的技术参考书。
本书由曹蓉蓉、刘小荷翻译;毕长剑、战晓苏审校。虽然与Herbert Schildt的高超造诣相比甚远,但是本书的译者和审校者还是凭借多年的C++教学和编程经验,在翻译、校译此书的过程中,抱着对读者认真负责的态度,力争将原书的风格和思想原原本本地呈现给读者。还要特别指出的是,清华大学出版社对本书非常重视,从全书的翻译、编辑、排版到印刷质量上都下了很大的功夫。因此,可以相信这本中译本能够成为对读者大有裨益的好书。
此外,我们曾专门以电子邮件方式与原书作者进行了多次沟通,将原书的个别错误在翻译、校译和审校过程中加以改正。限于水平的原因,中译本中不妥或错误之处在所难免,敬请广大读者批评指正。我们的e-mail是fwkbook@tup.tsinghua.edu.cn,读者有问题可随时联系。
Herbert Schildt 全球顶尖编程图书作者之一。他是C、C++、Java和C#编程语言的权威,也是Windows编程方面的专家。他的编程图书被译为多国语言(例如中文版《Java编程艺术》),在世界范围内的销量已经超过300万册。
从早期的FORTRAN语言开始,计算机语言就一直不断地发展演变。在此过程中,消除了不稳固的特性,取而代之的是一些功能强大的特性。多年过去后,这些进化的努力被精练为一种纯粹的形式,那就是程序设计语言应该具有的纯净本质。这么多年努力的结果就是C++语言的产生,在程序设计历史上,任何其他语言都没有像C++语言拥有如此重要的地位。
C++的成功取决于许多原因。语法简洁而优雅;对象模型简明流畅,容易理解;C++中提供了精心编写的库。然而,并非是这些特性为C++赢得历史上的重要地位,而是C++给予程序设计人员的强大的功能。从来没有其他的语言能够使得程序设计人员更加直接地控制计算机。通过使用C++,程序设计人员就是机器的主人—— 这正是所有的程序设计人员所需要的。
没有边界,没有限制,没有约束。这就是C++语言。
0.1 本书内容
本书不同于大多数其他的C++书籍。其他的C++书籍讲授语言的基础,而本书展示了如何应用C++在更大的范围内完成有趣的、有用的、甚至是神秘的程序设计任务。在此过程中充分显示了C++语言的强大功能和优雅性。
大致来说,本书包含两类应用程序,第一类称为“纯代码”,因为它们注重于扩展C++程序设计环境本身。第2章的垃圾回收器,第3章的线程控制面板以及第8章的定制STL容器都是这种类型的示例。第二类应用程序显示了如何应用C++来完成各种计算任务。例如,第5章开发了一个可以断点续传的网络下载工具,第6章给出了一个如何建立财务应用程序的范例,第8章中应用C++实现了人工智能应用。
本书以一段独特有趣的代码结束:Mini C++解释程序,这个程序可以解释C++的一个小子集。Mini C++解释程序揭示了C++的关键字和语法是如何一起工作从而组成这门语言的语法的。更重要的是,这可以使您了解这门语言的内部机制,并且显示了隐藏在C++设计背后的一些原因。使用Mini C++解释程序不仅有趣,它还可以用作开发您自己的语言的起点,还可以用作其他语言的解释程序。
本书每一章都提供了可以直接使用的代码。例如,第2章的垃圾回收器可以适用于许多程序设计任务。然而,只有把这些应用程序作为自己的开发起点,才会获益匪浅。例如,可以进一步完善第8章的Internet文件下载工具,使其可以在某个指定的时间开始下载,或者可以监控一个下载站点,保持下载最新的文件。总之,可以将这些不同的程序和子系统作为您开发自己项目的跳板。
0.2 预备知识
本书假定读者具有坚实的C++语言基础知识。读者应该能够创建、编译并运行C++程序。应该能够使用指针、模板以及异常处理,理解复制构造函数并且熟悉标准库的常用部分。因此,本书假定读者具有可以从C++教程中获得的技巧。
如果读者需要复习或者加强基础知识,作者推荐下面几本书。
C++ From the Ground Up
C++: A Beginner’s Guide
C++: The Complete Reference
这3本书都是McGraw-Hill/Osborne出版社发行的。其中C++: A Beginner’s Guide一书的第1版和第2版已经由清华大学出版社出版发行,书名为《C++基础教程》和《C++基础教程(第2版)》。
0.3 源代码
本书所有的示例和项目的源代码都可以从网站www.osborne.com上免费下载。