首页>参考读物>计算机科学与技术>软件与程序设计

C++语言的设计和演化
作者 : Bjarne Stroustrup
译者 : 裘宗燕
丛书名 : 计算机科学丛书
出版日期 : 2002-01-01
ISBN : 7-111-09098-5
定价 : 48.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 396
开本 : 16开
原书名 : The Design and Evolution of C++
原出版社: Addison-Wesley
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书是C++的设计者关于C++语言的最主要著作之一。作者综合性地论述了C++的历史和发展,C++中各种重要机制的本质意义和设计背景,这些机制的基本用途和使用方法,讨论了C++所适合的应用领域及其未来的发展前景。本书在帮助人们理解C++语言方面的作用是不可替代的。它值得每个学习、使用和关注C++语言的专业工作者、科研人员、教师和学生阅读。
  在本书中,作者还从实践的角度出发,讨论了许多与程序设计语言、系统程序设计、面向对象的技术和方法、软件系统的设计和实现技术等有关的问题,值得每一个关心这些领域及相关问题的计算机工作者和学生们阅读参考。

图书前言

一个人,如果不耕作,
就必须写作。
—Martin A. Hansen
ACM关于程序设计语言历史的HOLP-2会议要我写一篇关于C++历史的文章。这看起来是一个很合理的想法,还带着点荣誉性质,于是我就开始写了。为了对C++的成长有一个更全面更公平的观点,我向一些朋友咨询了他们对C++那些早期日子的记忆。这就使关于这项工作的小道消息不胫而走。有关的故事逐渐变了味,有一天,我忽然接到一个朋友的来函,问我在哪里可以买到我关于C++设计的新书。这个电子邮件就是本书的真正起源。
在传统上,关于程序设计和程序设计语言的书都是在解释某种语言究竟是什么,还有就是如何去使用它。但无论如何,有许多人也很想知道某个语言为什么会有它现在这个样子,以及它是怎样成为这个样子的。本书就是针对C++语言,想给出对后面这两个问题的解释。在这里要解释C++怎样从它的初始设计演化到今天的这个语言,要描述造就了C++的各种关键性的问题、设计目标、语言思想和各种约束条件,以及这些东西又是如何随着时间的推移而变化的。
自然,C++语言和造就它的设计思想、编程思想本身并不会演化,真正演化的是C++用户们对于实际问题的理解,以及他们对于为了帮助解决这些问题而需要的工具的理解。因此,在本书中也将追溯人们用C++去处理的各种关键性问题,以及实际处理那些问题的人们的认识,这些都对C++产生了重要影响。
C++仍然是一个年轻的语言,许多用户对这里将要讨论的一些问题还不知晓。这里所描述的各种决策的进一步推论,可能还需要一些年才能变得更清晰起来。本书要展示的是我个人关于C++如何出现、它是什么以及它应该是什么的观点。我希望这些东西能够帮助人们理解怎样才能最好地使用C++,理解C++的正在继续进行的演化进程。
书中特别要强调的是整体的设计目标、实际的约束以及造就出C++的那些人们。有关各种语言特征的关键性设计决策的讨论被放到了相应的历史环境里。在这里追溯了C++的演化过程,从带类的C开始,经过Release 1.0和2.0,直到当前ANSI/ISO的标准化工作,讨论了使用、关注、商业行为、编译系统、工具、环境和库的爆炸性增长,还讨论了C++与C和Simula关系的许多细节。对于C++与其他语言的关系只做了简短讨论。对主要语言功能的设计,例如类、继承、抽象类、重载、存储管理、模板、异常处理、运行时类型信息和名字空间等,都在一定细节程度上进行了讨论。
本书的根本目的,就是想帮助C++程序员更好地认识他们的语言、该语言的背景和基本概念;希望能激励他们去试验那些对他们来说还是新的C++使用方式。本书也可供有经验的程序员和程序设计语言的学生阅读,可能帮助他们确定使用C++是不是一件值得做的事情。
致谢
我非常感谢Steve Clamage,Tony Hansen,Lorraine Juhl,Peter Juhl,Brian Kernighan,Lee Knight,Doug Lea,Doug McIlroy,Barbara Moo,Jens Palsberg,Steve Rumsby和Christopher Skelly。感谢他们完整地阅读了本书的手稿,他们建设性的指教使本书的内容和组织都发生了重要变化。Steve Buroff,Martin Carroll,Sean Corfield,Tom Hagelskjoer,Rick Hollinbeck,Dennis Mancl和Stan Lippmann通过对一些章节的评论提供了帮助。还要感谢Archie Lachner在我还没有想到这本书之前就提出了对本书的要求。
自然,我还应该感谢那些帮助创造出C++语言的人们。从某种意义上说,本书就是献给他们的礼物,他们中一部分人的名字可以在各个章节和索引中找到。如果要我点出一些个人来,那就必然是Brian Kernighan,Andrew Koenig,Doug McIlroy和Jonathan Shopiro。他们中的每一位在过去十多年期间一直支持和鼓励我,也是提供各种想法的源泉。还有,感谢Kristen Nygaard和Dennis Ritchie作为Simula和C的设计师,C++从它们那里借用了一些关键性的成分。经过这些年,我已经逐渐了解到他们不仅是才华横溢的讲究实际的语言设计师,而且也是真正的绅士和绝对亲切的个人。


Bjarne Stroustrup
Murray Hill, New York

作者简介

Bjarne Stroustrup:Bjarne Stroustrup: C++的设计师和最早的实现者,被誉为“C++之父”。1950年出生于丹麦,1975年硕士毕业于丹麦Aarhus大学,1979年获英国剑桥大学计算机科学博士学位,现在是AT&T大规模程序设计研究部的负责人,AT&T贝尔实验室特别成员,ACM特别成员。他的研究兴趣包括分布式系统、操作系统、模拟设计和程序设计。他也是Addison-Wesley的C++ In-Depth系列书籍的主编。著有《C++程序设计语言》、《C++语言的设计与演化》等。 2002年10月应华章公司邀请访问了中国,在西安、北京、杭州、上海等地高校进行了演讲。

译者简介

裘宗燕:裘宗燕: 北京大学数学学院信息科学系教授。长期从事计算机软件与理论、程序设计语言和符号计算方面的研究和教学工作。已出版多部著作和译著,包括《程序设计语言基础》(译著,北京大学出版社,1990),《Mathematica数学软件系统的应用与程序设计》(编著,北京大学出版社,1994),《计算概论(上)》(合著,高等教育出版社,1997),《从问题到程序—程序设计与C语言引论》(编著,北京大学出版社,1999)等;自2000年以来,他先后为机械工业出版社华章分社翻译了《程序设计实践》(2000),《C++程序设计语言(特别版)》(2001),《C++语言的设计和演化》(2002),《程序设计语言——概念和结构》(2002),《从规范出发的程序设计》(2003),《计算机程序的构造和解释》(2004)等一系列经典著作,他认真的工作作风、严谨的治学态度,以及所做出的巨大贡献,赢得广大读者的好评。 在北京大学教授的主要课程:计算概论(一年级本科生,主要内容为C语言程序设计),程序设计技术与方法(本科生),程序设计语言原理(研究生),算法和数据结构(本科生),算法设计与分析(本科生和研究生),数理逻辑(本科生)等。 点击进入[URL=http://www.math.pku.edu.cn/teachers/qiuzy/]作者主页[/URL]。

译者序

这是一本独特的书,是由C++语言的设计师本人写的,描述C++语言的发展历史、设计理念及技术细节的著作。在计算机发展的历史上,这种从多方面多角度描述一种主流语言各个方面的综合性著作,至今我还只看到这一本。阅读本书,不仅可以了解有关C++语言的许多重要技术问题和细节,还可以进一步理解各种C++特征的设计出发点、设计过程中所考虑的方方面面问题,以及语言成形过程中的各种权衡与选择。每个学习和使用C++语言的人,一定能由此加深对自己所用工具的认识,进一步理解应该如何用好这个语言,此外还能看到作者对于复杂的系统程序设计的许多观点和想法。如果一个人想深入了解C++语言,想使C++成为自己得心应手的工具,想在复杂的系统程序设计领域中做出一些有价值的工作,想了解面向对象程序设计语言的一般性问题,想了解程序设计语言的发展现状、问题和前景,本书都是最值得阅读的书籍之一。
C++语言的设计目标是提供一种新的系统开发工具,希望能在一些方面比当时的各种工具语言有实质性的进步。今天来看,C++最重要的作用就是使那时的阳春白雪(数据抽象、面向对象的理论和技术等)变成了普通的系统开发人员可以触及、可以接受使用、可以从中获益的东西。这件事在计算科学技术发展的历史记录上必定会留下明显的痕迹。本书从一个最直接参予者的角度,记述了C++语言的起源和发展,记录了它怎样成长为今天的这个语言,怎样使语言研究的成果变成了程序员手中的现实武器。
从来都没有一种完美的程序设计语言。C++语言由于其出身(出自C语言),由于其发展过程中各种历史和现实因素的影响,也带着许多瑕疵和不和谐,尤其是在作为C++基础的C语言的低级成分与面向数据抽象的高级机制之间。对于一个目标是支持范围广泛的复杂系统实现的语言来说,这类问题也很难避免。为了系统的效率和资源的有效利用,人们希望有更直接的控制手段(低级机制);而为了将复杂的功能组织成人能够理解和把握的系统,又需要有高级的机制和结构。在使用一个同时提供了这两方面机制的语言时,应该如何合理而有效地利用它们,使之能互为补充而不是互相冲突,本书中许多地方讨论到这些问题,也提出了许多建议。这些,对于正确合理地使用C++语言都是极其重要的。
C++并不是每个人都喜欢的语言(没有任何语言可能做到这一点),但不抱偏见的人都会承认,C++语言取得了极大的成功。C++语言的工作开始于一个人(本书作者)的某种很合理、很直观的简单想法(为复杂的系统程序设计提供一种更好的工具),由于一个人始终不渝的努力,一小批人的积极参予,在一大批人(遍及世界的系统开发人员)的热心关注、评论和监督下,最终造就出了一项重要的工作。这个工作过程本身就非常耐人寻味,它也是在现代信息环境(主要是因特网)下,开展全球范围的科学技术研究的一个最早的演练。在这个成功中,商业的考虑、宣传和炒作从来没有起过任何实质性的作用,起作用的仍然是理性的思维、严肃的科学态度、无休止的踏踏实实的实际工作。这些,与今天在信息科学技术领域中常见的浮躁情绪和过分的利益追求形成了鲜明对比。许多事实给了我们一种警示:时尚转眼就可能变成无人理睬的烂泥,仅仅被眼球注意的东西很快就会被忽视,炒作最凶的东西往往也消失得最快,而真正有价值的成果则往往起源于人们最基本的需求和向往。
作为C++语言的创造者,作者对于自己的作品自然是珍爱有加。对某些针对C++语言的批评,本书中也有一些针锋相对的比较尖锐的观点。但通观全书,作者的论点和意见还是比较客观的,并没有什么过于情绪化的东西。在前瞻性讨论中,作者提出了许多预见。经过这五六年时间,其中一些已经变成了现实,也有些,例如特别有效的开发环境,还在发展之中。这些可能也说明了语言本身的一些性质:C++是个比较复杂的语言,做好支持它的工具绝不是一件容易的事情,在这些方面还有许多发展余地。
作者在讨论C++的设计和发展的过程中,还提出了许多人文科学领域的问题,提出了他在从事科学技术工作中的人文思考,其认识和观点也是C++成长为今天这样一个语言的基础。作者的这些想法也可以供我们参考。
今天,作为一种通用的系统程序设计语言,C++已经得到了广泛的认可。许多个人和企业将C++作为软件系统的开发工具,许多计算机专业课程用它作为工具语言。近十年来,国外的一些计算机教育工作者也一直在探索将C++作为CSl(计算机科学的第一门课程)的工作语言的可行性,国内学习和使用C++的人也越来越多。在这种情况下,由C++语言设计师Bjarne Stroustup本人撰写的有关C++的两部重要著作,本书和《C++程序设计语言》,即将在中国出版,这当然是非常有意义的事情。为此我非常感谢机械工业出版社的管理和编辑人员(相信许多计算机工作者也会如此),感谢他们在国内出版界更多关注时髦计算机图书的浪潮中,愿意付诸努力,出版一些深刻的、影响长远的重要著作。我祝愿这种工作能获得丰厚的回报,对于整个社会,也包括出版社自身。
作为译者,我希望作为自己工作结果的这个中译本能给学习C++语言、用这个语言从事教学、从事程序设计工作和复杂系统程序设计的人们提供一点帮助,使这本有关C++语言的最重要著作中阐述的事实和思想能够被更多人所了解。虽然我始终将这些铭记在心,但译文中仍难免出现差错和疏漏,在此也恳请有见识的读者不吝赐教。


裘宗燕
2001年6月于北大

裘宗燕  北京大学数学学院信息科学系教授。关心的主要学术领域包括计算机软件理论、程序设计方法学、程序设计语言和符号计算。已出版多部著作和译著,包括《程序设计语言基础》(译著,1990),《Mathematica数学软件系统的应用与程序设计》(1994),《从问题到程序—程序设计与C语言引论》(1999),《程序设计实践》(译著,2000)等。
e-mail:qzy@math.pku.edu.cn

图书目录

出版者的话
专家指导委员会
译者序
前言
致读者
引言
怎样读这本书
C++ 时间表
关注使用和用户们
程序设计语言
第 一 部 分
第1章  C++的史前时代 2
1.1  Simula和分布式系统 2
1.2  C与系统程序设计 4
1.3  一般性的背景 4
第2章  带类的C 7
2.1  带类的C的诞生 7
2.2  特征概览 8
2.3  类 9
2.4  运行时的效率 11
2.5  连接模型 13
2.5.1  纯朴的实现 15
2.5.2  对象布局模型 16
2.6  静态类型检查 17
2.6.1  窄转换 18
2.6.2  警告的使用 19
2.7  为什么用C 20
2.8  语法问题 22
2.8.1  C声明的语法 22
2.8.2  结构标志与类型名 23
2.8.3  语法的重要性 24
2.9  派生类 25
2.9.1  没有虚函数时的多态性 25
2.9.2  没有模板时的容器类 26
2.9.3  对象布局模型 27
2.9.4  回顾 28
2.10  保护模型 28
2.11  运行时的保证 31
2.11.1  建构函数与析构函数 31
2.11.2  存储分配和建构函数 31
2.11.3  调用函数和返回函数 32
2.12  次要特征 32
2.12.1  赋值的重载 33
2.12.2  默认参数 33
2.13  考虑过,但是没有提供的特征 34
2.14  工作环境 35
第3章  C++的诞生 38
3.1  从带类的C到C++ 38
3.2  目标 39
3.3  Cfront 40
3.3.1  生成C 41
3.3.2  分析C++ 42
3.3.3  连接问题 43
3.3.4  Cfront发布 43
3.4  语言特征 45
3.5  虚函数 45
3.5.1  对象布局模型 47
3.5.2  覆盖和虚函数匹配 49
3.5.3  基成员的遮蔽 49
3.6  重载 50
3.6.1  基本重载 51
3.6.2  成员和友元 52
3.6.3  运算符函数 54
3.6.4  效率和重载 55
3.6.5  变化和新运算符 56
3.7  引用 56
3.8  常量 59
3.9  存储管理 61
3.10  类型检查 62
3.11  次要特征 63
3.11.1  注释 63
3.11.2  建构函数的记法 63
3.11.3  量化 64
3.11.4  全局变量的初始化 65
3.11.5  声明语句 67
3.12  与经典C的关系 69
3.13  语言设计的工具 71
3.14  《C++程序设计语言》(第1版) 73
3.15  有关“什么是”的论文 73
第4章  C++语言设计规则 76
4.1  规则和原理 76
4.2  一般性规则 77
4.3  设计支持规则 80
4.4  语言的技术性规则 82
4.5  低级程序设计支持规则 85
4.6  结束语 86
第5章  1985—1993年表 87
5.1  引言 87
5.2  Release  2.0 87
5.3  《带标注的C++参考手册》 90
5.4  ANSI和ISO标准化 91
第6章  标准化 95
6.1  什么是标准 95
6.1.1  实现细节 96
6.1.2  现实的检查 97
6.2  委员会如何运作 97
6.3  净化 99
6.3.1  查找问题 99
6.3.2  临时量的生存期 103
6.4  扩充 106
6.4.1  评价准则 108
6.4.2  状况 110
6.4.3  好的扩充问题 111
6.4.4  一致性 112
6.5  扩充建议实例 112
6.5.1  关键词参数 113
6.5.2  受限指针 116
6.5.3  字符集 117
第7章  关注和使用 120
7.1  关注和使用的爆炸性增长 120
7.1.1  C++市场的缺位 121
7.1.2  会议 121
7.1.3  杂志和书籍 122
7.1.4  编译程序 122
7.1.5  工具和环境 123
7.2  C++的教与学 124
7.3  用户和应用 128
7.3.1  早期用户 129
7.3.2  后来的用户 129
7.4  商业竞争 130
7.4.1  传统语言 130
7.4.2  更新一些的语言 131
7.4.3  期望和看法 132
第8章  库 134
8.1  引言 134
8.2  C++库设计 134
8.2.1  库设计的折衷 135
8.2.2  语言特征和库的构造 135
8.2.3  处理库的多样性 135
8.3  早期的库 136
8.3.1  I/O流库 137
8.3.2  并行支持 139
8.4  其他库 142
8.4.1  基础库 142
8.4.2  持续性和数据库 143
8.4.3  数值库 143
8.4.4  专用库 143
8.5  一个标准库 144
第9章  展望 146
9.1  引言 146
9.2  回顾 146
9.2.1  C++在其预期领域取得了成功吗 147
9.2.2  C++是不是一个统一的语言 147
9.2.3  什么是最大失误 150
9.3  仅仅是一座桥梁吗 150
9.3.1  在一个很长的时期里我们还需要这座
桥梁 151
9.3.2  如果C++是答案,那么问题是什么 151
9.4  什么能够使C++更有效 154
9.4.1  稳定性和标准 154
9.4.2  教育和技术 154
9.4.3  系统方面的问题 155
9.4.4  在文件和语法之外 156
9.4.5  小结 156
第 二 部 分
第10章  存储管理 160
10.1  引言 160
10.2  将存储分配和初始化分离 161
10.3  数组分配 162
10.4  放置 162
10.5  存储释放问题 163
10.6  存储器耗尽 166
10.7  自动废料收集 167
10.7.1  可选的废料收集 167
10.7.2  可选的废料收集应该是什么样
子的 168
第11章  重载 170
11.1  引言 170
11.2  重载的解析 170
11.2.1  细粒度解析 171
11.2.2  歧义控制 172
11.2.3  空指针 175
11.2.4  overload关键字 176
11.3  类型安全的连接 177
11.3.1  重载和连接 178
11.3.2  C++连接的一种实现 179
11.3.3  回顾 180
11.4  对象的建立和复制 181
11.4.1  对复制的控制 182
11.4.2  对分配的控制 182
11.4.3  对派生的控制 183
11.4.4  按成员复制 184
11.5  记法约定 185
11.5.1  灵巧指针 185
11.5.2  灵巧引用 186
11.5.3  增量和减量的重载 189
11.5.4  重载->* 190
11.5.5  重载逗号运算符 190
11.6  给C++增加运算符 191
11.6.1  指数运算符 191
11.6.2  用户定义运算符 193
11.6.3  复合运算符 194
11.7  枚举 195
11.7.1  基于枚举的重载 196
11.7.2  布尔类型 197
第12章  多重继承 198
12.1  引言 198
12.2  普通基类 198
12.3  虚基类 199
12.4  对象布局模型 203
12.4.1  虚基布局 205
12.4.2  虚基和强制 206
12.5  方法组合 207
12.6  有关多重继承的论战 208
12.7  委托 210
12.8  重命名 211
12.9  基和成员初始式 213
第13章  类概念的精炼 215
13.1  引言 215
13.2  抽象类 215
13.2.1  为处理错误而用的抽象类 215
13.2.2  抽象类型 217
13.2.3  语法 218
13.2.4  虚函数和建构函数 219
13.3  const成员函数 221
13.3.1  强制去掉const 221
13.3.2  const定义的精炼 222
13.3.3  易变性与强制 223
13.4  静态成员函数 224
13.5  嵌套的类 225
13.6  Inherited:: 226
13.7  放松覆盖规则 228
13.8  多重方法 231
13.9  保护成员 235
13.10  改进代码生成 236
13.11  到成员的指针 236
第14章  强制 239
14.1  主要扩充 239
14.2  运行时类型信息 239
14.2.1  问题 240
14.2.2  dynamic_cast运算符 241
14.2.3  RTTI的使用和误用 245
14.2.4  为什么提供一个“危险特征” 247
14.2.5  typeid()运算符 248
14.2.6  对象布局模型 251
14.2.7  一个例子:简单的I/O对象 252
14.2.8  考虑过的其他选择 254
14.3  强制的一种新记法 257
14.3.1  问题 257
14.3.2  static_cast运算符 259
14.3.3  reinterpret_cast运算符 260
14.3.4  const_cast运算符 262
14.3.5  新风格强制的影响 263
第15章  模板 266
15.1  引言 266
15.2  模板 266
15.3  类模板 269
15.4  对模板参数的限制 271
15.4.1  通过派生加以限制 272
15.4.2  通过使用加以限制 272
15.5  避免代码重复 273
15.6  函数模板 275
15.6.1  函数模板参数的推断 275
15.6.2  描述函数模板的参数 277
15.6.3  函数模板的重载 278
15.7  语法 280
15.8  组合技术 282
15.8.1  表述实现的策略 283
15.8.2  描述顺序关系 283
15.9  模板类之间的关系 285
15.9.1  继承关系 285
15.9.2  转换 287
15.9.3  成员模板 288
15.10  模板的实例化 289
15.10.1  显式的实例化 290
15.10.2  实例化点 291
15.10.3  专门化 296
15.10.4  查找模板定义 298
15.11  模板的作用 299
15.11.1  实现与界面的分离 300
15.11.2  灵活性和效率 301
15.11.3  对C++其他部分的影响 301
第16章  异常处理 303
16.1  引言 303
16.2  异常处理的目标 303
16.3  语法 305
16.4  结组 305
16.5  资源管理 306
16.6  唤醒与终止 309
16.7  非同步事件 311
16.8  多层传播 312
16.9  静态检查 312
16.10  不变式 314
第17章  名字空间 316
17.1  引言 316
17.2  问题 317
17.3  解决方案的思想 318
17.4  一个解决方案:名字空间 320
17.4.1  有关使用名字空间的观点 321
17.4.2  使名字空间投入使用 322
17.4.3  名字空间的别名 323
17.4.4  利用名字空间管理版本问题 324
17.4.5  细节 326
17.5  对于类的影响 331
17.5.1  派生类 331
17.5.2  使用基类 332
17.5.3  清除全局的static 333
17.6  与C语言的兼容性 334
第18章  C语言预处理器 336
参考文献 339
索引 347

教学资源推荐
作者: 郑阿奇 主编 丁有和 等编著
参考读物推荐