深入 系列
Primer
第三版
著
中
中
文
文
版
版
潘爱民 张丽 译
Addison-Wesley
中国电力出版社
www.infopower.com.cn
Stanley B Lippman
Josée Lajoie
http://bbs.qzzn.com/
译序
这是我心仪已久的一本书 我相信很多读者也有同样的感受
在所有的编程语言中 C++可以说是最为复杂的 它既是一门传统的编程语言 也是一门
新的编程语言 说它是一门传统语言 是因为 C++诞生已将近 20 年的历史了 特别是最近 10
年来 C++得到了快速的发展 C++是计算机软件领域中覆盖面最为广阔的编程语言 并且 与
C++相关的智力投入也是其他任何一门语言所无法比拟的 人们对于 C++的研究已经远远超出
了对于一门编程语言所应有的关注 所以 现在的 C++已经非常成熟 有大量的资源 文档
书籍 源代码等等 可供我们使用 说 C++是一门新的编程语言 是因为在 1998 年 C++由 ISO
International Standards Organization 完成了标准化 从此 C++领域有了统一的标准 所
有的编译器都将向标准靠拢 或者说 与标准兼容 这有利于我们写出可移植的 C++代码来
同时 C++标准也统一了 C++标准库 为 C++用户提供了最为基本的基础设施 C++经历了多年
的发展 终于有了一个相对稳定的版本 所以 我们应该用一种新的眼光来看待 C++ 而不再
简单地把 C++认为是 C 语言的超集 本书正是新版本 C++的写照 通过本书 你可以重新审视
C++语言 这是我翻译过程中最为真切的体会 它纠正了我过去对于 C++语言的一些误解 虽
然我从 1993 年开始就一直在使用 C++ 但是直到阅读了这本书之后 我才从真正意义上全面
地认识了 C++语言
本书的权威性无需我多说 看看本书原著的前言 了解了两位作者的背景之后 你就可以
知道 这本书是经验和标准的完美结合 Stanley Lippman 从 1984 年开始一直从事 C++方面的
工作 在 C++的实现与应用方面有着丰富的经验 本书前两个版本的成功也证明了他在阐释
C++语言方面的独到之处 Josée Lajoie 从 1990 年开始成为 C++标准委员会的一名成员 并且
承担了很重要的职务 由于她的参与 毫无疑问 本书一定是与标准兼容的
讲述 C++的书非常多 并且不乏优秀和经典之作 在如此众多的 C++书籍中 本书仍具有
不可替代的地位 我想主要的原因在于本书具有以下几个特色
l 内容广阔 从本书的规模 厚度 就可以看出这一点 C++语言融入了大量优秀的特
性 其内容的丰富程度已经远非 C 语言所能及 在所有的 C++书籍中 本书的覆盖面是最为广
阔的 从最基本的 C++程序设计 到面向对象程序设计 以及基于模板的程序设计 面面俱到
而且讲解细致入微 值得仔细品味
2 许多实际的范例程序 纯粹的技术讲解总是非常枯燥的 但是阅读本书并不感觉枯燥
因为作者在介绍每一部分内容的时候都结合一个实际的例子 读者通过这些例子能够很容易地
掌握相应的技术要点 并且看到每一种技术的实际用法 这是本书之所以引人入胜的重要原因
之一
3 叙述内容的安排 C++是一门多风格的程序设计语言 multi-paradigm Programming
language 不仅支持面向对象程序设计 也支持其他的程序设计思想 本书的叙述结构正体现
了 C++的这种特点 作者从程序设计思想的角度分别讲述了 C++的各种语言要素 便读者比较
http://bbs.qzzn.com/
II 译序
容易抓住 C++语言的本质特征
4 与编译器无关 遵从 C++标准 本书的内容并不特定于某一个 C++编译器实现 而
是适用于所有与 C++标准兼容的编译器 作者在讲解过程中也指出了编译器的一些内部考虑
例如 编译器如何在各种上下文环境中解析重载函数 如何处理除式类型转换 等等 这些内
容有利于加深读者对 C++的理解
5 配套的练习 在每一节讲解之后 作者给出了一些练习 这些练习反映了这一节的中
心内容 读者通过这些练习可以巩固所学的知识 所以 本书也可以被用作教材 用于系统全
面地学习 C++语言
虽然本书书名 C++ Primer 的中文含义是 C++初级读本 但是它绝对不是一本很轻
松的入门教材 特别是关于名字空间 函数重载解析过程 模板机制和泛型算法 generic
algorithms 等内容并不是一个 C++初学者能够很快掌握的 如果你以前没有看过其他的 C++
书籍 那么可能需要反复阅读多遍才能掌握本书讲述的内容 如果你已经有了 C++的基础 比
如 已经看过其他的 C++入门书籍 那么阅读本书可以让你快速掌握 C++的要点 如果你是
一名有多年 C++实践经验的程序员 那么阅读本书可以让你重新理解 C++ 总之 这是一本很
好的学习和参考书籍 值得你反复阅读 但是 正如书名所指示的 它不是一本高级书籍 按
照我个人理解 它的技术水准应该在中等偏深一点的层次上
本书的翻译工作由我和张丽共同完成 张丽完成了初稿的翻译工作 我做了第二遍翻译检
查工作 书中每一句话我都认真检查过 个别地方还修改了原著的一些错误 C++中有些术语
还没有统一的中文说法 对于这些术语的处理 我们尽可能地做到符合中文的语言习惯 读者
可以参考本书最后所附的英汉对照索引 这份索引是由中国电力出版社的诸位编辑手工制作完
成的 他们是刘江 朱恩从 陈维宁 程璐 关敏 刘君 夏平 宋宏 姚贵胜 常虹 乔晶
阎宏 感谢他 她 们的辛勤劳动
在翻译过程中 不断收到读者来信或者来电询问这本书的出版情况 我理解读者对于一本
好书的迫切心情 我的想法是 有关 C++的书籍和资料如此之多 所以 学习 C++不一定非要
阅读这本书 但是它可以加快你学习的步伐 并且帮助你深入而全面地理解 C++ 既然你已经
看到了这本书 那就不要错过吧
这本书不会让你失望的 我坚信这一点
潘爱民
北京大学燕北园
http://bbs.qzzn.com/
前言
本书第二版和第三版之间的变化非常大 其中最值得注意的是 C++已经通过了国际标
准化 这不但为语言增加了新的特性 比如异常处理 运行时刻类型识别 RTTI 名字空
间 内置布尔数据类型 新的强制转换方式 而且还大量修改并扩展了现有的特性 比如模
板 template 支持面向对象 object-oriented 和基于对象 object-based 程序设计所需
要的类 class 机制 嵌套类型以及重载函数的解析机制 也许更重要的是 一个覆盖面非
常广阔的库现在成了标准 C++的一部分 其中包括以前称为 STL 标准模板库 的内容 新
的 string 类型 一组顺序和关联容器类型 比如 vector list map 和 set 以及在这些类型
上进行操作的一组可扩展的泛型算法 generic algorithm 都是这个新标准库的特性 本书
不但包括了许多新的资料 而且还阐述了怎样在 C++中进行程序设计的新的思考方法 简而
言之 实际上 不但 C++已经被重新创造 本书第三版也是如此
在第三版中 不但对语言的处理方式发生了根本的变化 而且作者本身也发生了变化
首先 我们的人数已经加倍 而且 我们的写作过程也已经国际化了 尽管我们还牢牢扎根
于北美大陆 Stan Lippman 是美国人 Josée Lajoie 是加拿大人 最后 这种双作者关系也
反映了 C++团体的两类主要活动 Stan 现在正在迪斯尼动画公司 Walt Disney Feature
Animation
*
致力于以 C++为基础的 3D 计算机图形和动画应用 而 Josée 正专心于 C++的定
义与实现 同时她也是 C++标准的核心语言小组的主席
**
以及 IBM 加拿大实验室的 C++编
译器组的成员
Stan是 Bell 实验室中与 Bjarne Stroustrup C++的发明者 一起工作的早期成员之一
从 1984 年开始一直从事 C++方面的工作 Stan 曾经致力于原始 C++编译器 cfront 的各种实
现 从 1986 年的版本 1.1 到版本 3.0 并领导了 2.1 和 3.0 版本的开发组 之后 他参与了
Stroustrup 领导的 Foundation Research Project 项目中关于程序设计环境的对象模型部分
Josée作为 IBM 加拿大实验室 C++编译器组的成员已经有八年时间了 从 1990 年开始她
成为 C++标准委员会的成员 她曾经担任委员会的副主席三年 日前担任核心语言小组委员
会的主席已经达四年之久
本书第三版是一个大幅修订的版本 不仅反映了语言的变化和扩展 也反映了作者洞察
力和经验的变化
*
Stan Lippman 现已受雇于 Microsoft
成为 Visual C++ .Net 的架构设计师
**
Josée Lajoie 现正在滑铁卢大学攻读硕士学位.已不再担任该委员会的主席
现任主席为 Sun 公司的 Steve
Clamage
http://bbs.qzzn.com/
IV 译序
本书的结构
本书为 C++国际标准进行了全面的介绍 在此意义上 它是一个初级读本 primer
它提供了一种指导性的方法来描述 C++语言 但是 它也为 C++语言提供了一种简单而温
和的描述 从这个角度来看 它不是一本初级读物 C++语言的程序设计要素 比如异常
处理 容器类型 面向对象的程序设计等等 都在解决特定问题或程序设计任务的上下文环
境中展示出来 C++语言的规则 比如重载函数调用的解析过程以及在面向对象程序设计下
支持的类型转换 本书都有广泛的论述 这似乎超出了一本初级读本的范畴 我们相信 为
了加强读者对于 C++语言的理解 覆盖这些内容是必要的 对于这些材料 读者应该不时地
回头翻阅 而不是一次消化了事 如果开始的时候你发现这些内容比较难以接受或者过于枯
燥 请把它们放到一边 以后再回头来看——我们为这样的章节加上了特殊的记号
阅读本书不需要具备 C 语言的知识 但是 熟悉某些现代的结构化语言会使学习进展更
快一些 本书的意图是作为学习 C++的第一本书 而不是学习程序设计的第一本书 为了确
保这一点 我们会以一个公共的词汇表作为开始 然而 开始的章节涵盖了一些基本的概念
比如循环语句和变量等 有些读者可能会觉得这些概念太浅显了 不必担心 深层的内容很
快就会看到
C++的许多威力来自于它对程序设计新方法的支持 以及对程序设计问题的思考方式
因此 要想有效地学习使用 C++ 不要只想简单地学会一组新的语法和语义 为了使这种学
习更加容易 本书将围绕一系列可扩展的例子来组织内容 这些例子被用来介绍各种语言特
性的细节 同时也说明了这些语言特性的动机所在 当我们在一个完整例子的上下文环境中
学习语言特性时 对这些特性为什么会有用处也就变得很清楚了 它会使我们对于 何时以
及怎样在实际的问题解决过程中使用这些特性 有一些感觉 另外 把焦点放在例子上 可
使读者能够尽早地使用一些概念 随着读者的知识基础被建立起来之后 这些概念会进一步
完整地解释清楚 本书前面的例子含有 C++基本概念的简单用法 读者可以先领略一下 C++
中程序设计的概貌 而不要求完全理解 C++程序设计和实现的细节
第 1 章和第 2 章形成了一个独立完整的 C++介绍和概述 第一篇的目的是使我们快速地
理解 C++支持的概念和语言设施 以及编写和执行一个程序所需要的基础知识 读完这部分
内容之后 你应该对 C++语言有了一些认识 但是还谈不上真正理解 C++ 这就够了 那是
本书余下部分的目的
第 1 章向我们介绍了语言的基本元素 内置数据类型 变量 表达式 语句以及函数
它将介绍一个最小的 合法的 C++程序 简要讨论编译程序的过程 介绍所谓的预处理器
preprocessor 以及对输入和输出的支持 它给出了多个简单但却完整的 C++程序 鼓励
读者亲自编译并执行这些程序 第 2 章介绍了 C++是如何通过类机制 为基于对象和面向对
象的程序设计提供支持的 同时通过数组抽象的演化过程来说明这些设计思想 另外 它简
要介绍了模板 名字空间 异常处理 以及标准库为一般容器类型和泛型程序设计提供的支
持 这一章的进度比较快 有些读者可能会觉得难以接受 如果是这样 我们建议你跳过这
一章 以后再回过头来看它
C++的基础是各种设施 它们使用户能够通过定义新的数据类型来扩展语言本身 这些
http://bbs.qzzn.com/