内容简介

  《C++程序设计语言》(原书第4版)是C++领域经典的参考书,介绍了C++11的各项新特性和新功能。《C++程序设计语言(第1-3部分)(原书第4版)》共分四部分。部分(第1~5章)是引言,包括C++的背景知识,C++语言及其标准库的简要介绍;第二部分(第6~15章)介绍C++的内置类型和基本特性,以及如何用它们构造程序;第三部分(第16~29章)介绍C++的抽象机制及如何用这些机制编写面向对象程序和泛型程序;第四部分(第30~44章)概述标准库并讨论一些兼容性问题。由于篇幅问题,原书中文版分两册出版,分别对应原书的至三部分和第四部分。这一册为至三部分。

目录

TheC++ProgrammingLanguage,FourthEdition
出版者的话
译者序
前言
第3版前言
第2版前言
第1版前言
第一部分 引言
第1章 致读者2
1.1 《C++程序设计语言(第1-3部分)(原书第4版)》结构2
1.1.1 引言2
1.1.2 基本特性3
1.1.3 抽象机制4
1.1.4 标准库5
1.1.5 例子和参考文献5
1.2 C++的设计7
1.2.1 程序设计风格8
1.2.2 类型检查11
1.2.3 C兼容性12
1.2.4 语言、库和系统12
1.3 学习C++14
1.3.1 用C++编程15
1.3.2 对C++程序员的建议16
1.3.3 对C程序员的建议16
1.3.4 对Java程序员的建议17
1.4 C++的历史18
1.4.1 大事年表19
1.4.2 早期的C++19
1.4.3 1998标准21
1.4.4 2011标准23
1.4.5 C++的用途26
1.5 建议27
1.6 参考文献28
第2章 C++概览:基础知识32
2.1 引言32
2.2 基本概念33
2.2.1 Hello,World!33
2.2.2 类型、变量和算术运算34
2.2.3 常量36
2.2.4 检验和循环37
2.2.5 指针、数组和循环38
2.3 用户自定义类型40
2.3.1 结构41
2.3.2 类42
2.3.3 枚举43
2.4 模块化44
2.4.1 分离编译45
2.4.2 名字空间46
2.4.3 错误处理47
2.5 附记50
2.6 建议50
第3章 C++概览:抽象机制51
3.1 引言51
3.2 类51
3.2.1 具体类型52
3.2.2 抽象类型56
3.2.3 虚函数58
3.2.4 类层次59
3.3 拷贝和移动62
3.3.1 拷贝容器63
3.3.2 移动容器64
3.3.3 资源管理66
3.3.4 抑制操作66
3.4 模板67
3.4.1 参数化类型67
3.4.2 函数模板69
3.4.3 函数对象69
3.4.4 可变参数模板71
3.4.5 别名72
3.5 建议73
第4章 C++概览:容器与算法74
4.1 标准库74
4.1.1 标准库概述75
4.1.2 标准库头文件与名字空间75
4.2 字符串77
4.3 I/O流78
4.3.1 输出78
4.3.2 输入79
4.3.3 用户自定义类型的I/O80
4.4 容器81
4.4.1 vector81
4.4.2 list84
4.4.3 map85
4.4.4 unordered_map86
4.4.5 容器概述86
4.5 算法87
4.5.1 使用迭代器88
4.5.2 迭代器类型90
4.5.3 流迭代器91
4.5.4 谓词93
4.5.5 算法概述93
4.5.6 容器算法94
4.6 建议94
第5章 C++概览:并发与实用功能96
5.1 引言96
5.2 资源管理96
5.2.1 unique_ptr与shared_ptr97
5.3 并发99
5.3.1 任务和thread99
5.3.2 传递参数100
5.3.3 返回结果100
5.3.4 共享数据101
5.3.5 任务通信103
5.4 小工具组件106
5.4.1 时间106
5.4.2 类型函数107
5.4.3 pair和tuple109
5.5 正则表达式110
5.6 数学计算111
5.6.1 数学函数和算法111
5.6.2 复数111
5.6.3 随机数112
5.6.4 向量算术113
5.6.5 数值限制113
5.7 建议114
第二部分 基本功能
第6章 类型与声明116
6.1 ISOC++标准116
6.1.1 实现117
6.1.2 基本源程序字符集118
6.2 类型118
6.2.1 基本类型119
6.2.2 布尔值119
6.2.3 字符类型121
6.2.4 整数类型124
6.2.5 浮点数类型126
6.2.6 前缀和后缀127
6.2.7 void128
6.2.8 类型尺寸128
6.2.9 对齐130
6.3 声明131
6.3.1 声明的结构133
6.3.2 声明多个名字134
6.3.3 名字134
6.3.4 作用域136
6.3.5 初始化138
6.3.6 推断类型:auto和decltype()141
6.4 对象和值144
6.4.1 左值和右值144
6.4.2 对象的生命周期145
6.5 类型别名146
6.6 建议147
第7章 指针、数组与引用148
7.1 引言148
7.2 指针148
7.2.1 void*149
7.2.2 nullptr150
7.3 数组150
7.3.1 数组的初始化器152
7.3.2 字符串字面值常量152
7.4 数组中的指针155
7.4.1 数组漫游156
7.4.2 多维数组158
7.4.3 传递数组159
7.5 指针与const161
7.6 指针与所有权163
7.7 引用163
7.7.1 左值引用164
7.7.2 右值引用167
7.7.3 引用的引用169
7.7.4 指针与引用170
7.8 建议172
第8章 结构、联合与枚举173
8.1 引言173
8.2 结构173
8.2.1 struct的布局175
8.2.2 struct的名字176
8.2.3 结构与类177
8.2.4 结构与数组178
8.2.5 类型等价180
8.2.6 普通旧数据180
8.2.7 域182
8.3 联合183
8.3.1 联合与类185
8.3.2 匿名union186
8.4 枚举188
8.4.1 enumclass188
8.4.2 普通的enum191
8.4.3 未命名的enum192
8.5 建议193
第9章 语句194
9.1 引言194
9.2 语句概述194
9.3 声明作为语句195
9.4 选择语句196
9.4.1 if语句196
9.4.2 switch语句198
9.4.3 条件中的声明200
9.5 循环语句201
9.5.1 范围for语句201
9.5.2 for语句202
9.5.3 while语句203
9.5.4 do语句203
9.5.5 退出循环204
9.6 goto语句204
9.7 注释与缩进205
9.8 建议207
第10章 表达式208
10.1 引言208
10.2 一个桌面计算器示例208
10.2.1 分析器209
10.2.2 输入213
10.2.3 底层输入216
10.2.4 错误处理217
10.2.5 驱动程序217
10.2.6 头文件218
10.2.7 命令行参数218
10.2.8 关于风格220
10.3 运算符概述220
10.3.1 结果224
10.3.2 求值顺序224
10.3.3 运算符优先级225
10.3.4 临时对象226
10.4 常量表达式227
10.4.1 符号化常量229
10.4.2 常量表达式中的const229
10.4.3 字面值常量类型229
10.4.4 引用参数230
10.4.5 地址常量表达式231
10.5 隐式类型转换231
10.5.1 提升231
10.5.2 类型转换232
10.5.3 常用的算术类型转换234
10.6 建议235
第11章 选择适当的操作236
11.1 其他运算符236
11.1.1 逻辑运算符236
11.1.2 位逻辑运算符236
11.1.3 条件表达式238
11.1.4 递增与递减238
11.2 自由存储240
11.2.1 内存管理241
11.2.2 数组243
11.2.3 获取内存空间244
11.2.4 重载new245
11.3 列表247
11.3.1 实现模型248
11.3.2 限定列表249
11.3.3 未限定列表249
11.4 lambda表达式251
11.4.1 实现模型251
11.4.2 lambda的替代品252
11.4.3 捕获254
11.4.4 调用与返回257
11.4.5 lambda的类型257
11.5 显式类型转换258
11.5.1 构造259
11.5.2 命名转换261
11.5.3 C风格的转换262
11.5.4 函数形式的转换262
11.6 建议263
第12章 函数264
12.1 函数声明264
12.1.1 为什么使用函数265
12.1.2 函数声明的组成要件265

前言/序言

  TheC++ProgrammingLanguageFourthEdition所有计算机科学问题,都可以通过引入一个新的间接层次来解决,那些已有过多间接层次的问题除外。
  ——DavidJ.Wheeler与C++98标准相比,C++11标准让我可以更清晰、更简洁而且更直接地表达自己的想法。而且,新版本的编译器可以对程序进行更好的检查并生成更快的目标程序。因此,C++11给人的感觉就像是一种新语言一样。
  在《C++程序设计语言(第1-3部分)(原书第4版)》中,我追求完整性(completeness)。我会介绍专业程序员可能需要的每个语言特性和标准库组件。对每个特性或组件,我将给出:
  基本原理:设计这个特性(组件)是为了帮助解决哪类问题?其设计原理是什么?它有什么根本的局限?规范:它该如何定义?我将以专业程序员为目标读者来选择内容的详略程度,对于要求更高的C++语言研究者,有很多ISO标准的文献可供查阅。
  例子:当单独使用这个特性或与其他特性组合使用时,如何用好它?其中的关键技术和习惯用法是怎样的?在程序的可维护性和性能方面是否有一些隐含的问题?多年来,无论是C++语言本身还是它的使用,都已经发生了巨大改变。从程序员的角度,大多数改变都属于语言的改进。与之前的版本相比,当前的ISOC++标准(ISO/IEC14882-2011,通常称为C++11)在编写高质量代码方面无疑是一个好得多的工具。但是它好在哪里?现代C++语言支持什么样的程序设计风格和技术?这些技术靠哪些语言特性和标准库特性来支撑?精练、正确、可维护性好、性能高的C++代码的基本构建单元是怎样的?《C++程序设计语言(第1-3部分)(原书第4版)》将回答这些关键问题。很多答案已经不同于1985、1995或2005等旧版本的C++语言了:C++在进步。
  C++是一种通用程序设计语言,它强调富类型、轻量级抽象的设计和使用。C++特别适合开发资源受限的应用,例如可在软件基础设施中发现的那些应用。那些花费时间学习高质量代码编写技术的程序员将会从C++语言受益良多。C++是为那些严肃对待编程的人而设计的。人类文明已经严重依赖软件,编写高质量的软件非常重要。
  目前已经部署的C++代码达到数十亿行,因此程序稳定性备受重视——很多1985年和1995年编写的C++代码仍然运行良好,而且还会继续运行几十年。但是,对所有这些应用程序,都可以用现代C++语言写出更好的版本;如果你墨守成规,将来写出的代码将会是低质量、低性能的。对稳定性的强调还意味着,你现在遵循标准写出的代码,在未来几十年中会运行良好。《C++程序设计语言(第1-3部分)(原书第4版)》中所有代码都遵循2011ISOC++标准。
  《C++程序设计语言(第1-3部分)(原书第4版)》面向三类读者:
  想知道新的ISOC++标准都提供了哪些新特性的C++程序员。
  好奇C++到底提供了哪些C语言的特性的C程序员。
  具备Java、C#、Python和Ruby等编程语言背景,正在探寻“更接近机器”的语言,即更灵活、提供更好的编译时检查或是更好性能的语言的程序员。
  自然,这三类读者可能是有交集的——一个专业软件开发者通常掌握多门编程语言。
  《C++程序设计语言(第1-3部分)(原书第4版)》假定目标读者是程序员。如果你想问“什么是for循环?”或是“什么是编译器?”,那么《C++程序设计语言(第1-3部分)(原书第4版)》现在还不适合你,我向你推荐我的另一《C++程序设计语言(第1-3部分)(原书第4版)》《C++程序设计原理与实践》,这《C++程序设计语言(第1-3部分)(原书第4版)》适合作为程序设计和C++语言的入门书籍。而且,我假定读者是较为成熟的软件开发者。如果你的问题是“为什么要费力进行测试?”或者认为“所有语言基本都是一样的,给我看语法就可以了”,甚至确信存在一种适合所有任务的完美语言,那么《C++程序设计语言(第1-3部分)(原书第4版)》也不适合你。
  相对于C++98,C++11提出了哪些改进和新特性呢?适合现代计算机的机器模型会涉及大量并发处理。为此,C++11提供了用于系统级并行编程(如使用多核)的语言和标准库特性。C++11还提供了正则表达式处理、资源管理指针、随机数、改进的容器(包括哈希表)以及其他很多特性。此外,C++11还提供了通用和一致的初始化机制、更简单的for语句、移动语义、基础的Unicode支持、lambda表达式、通用常量表达式、控制类缺省定义的能力、可变参数模板、用户定义的字面值常量和其他很多新特性。请记住,这些标准库和语言特性的目标就是支撑那些用来开发高质量软件的程序设计技术。这些特性应该组合使用——将它们看作盖大楼的砖,而不应该相互隔离地单独使用来解决特定问题。计算机是一种通用机器,而C++在其中起着重要作用。特别是,C++的设计目标就是足够灵活和通用,以便处理那些连它的设计者都未曾想象过的未来难题。
  致谢除了《C++程序设计语言(第1-3部分)(原书第4版)》上一版致谢提及的人之外,我还要感谢PeteBecker、Hans-J.Boehm、MarshallClow、JonathanCoe、LawrenceCrowl、WalterDaugherty、J.DanielGarcia、RobertHarle、GregHickman、HowardHinnant、BrianKernighan、DanielKrügler、NevinLiber、MichelMichaud、GaryPowell、JanChristiaanvanWinkel和LeorZolman。没有他们的帮助,《C++程序设计语言(第1-3部分)(原书第4版)》的质量要差得多。
  感谢HowardHinnant为我解答很多有关标准库的问题。
  AndrewSutton是Origin库的作者,模板相关章节中很多模拟概念的讨论都是基于这个测试平台的。他还是Matrix库的作者,这是第29章的主题。Origin库是开源的,在互联网上搜索“Origin”和“AndrewSutton”就能找到。
  感谢我指导的毕业设计班,他们从部分中找出的问题比其他任何人都多。
  假如我能遵照审阅人的所有建议,毫无疑问会大幅度提高《C++程序设计语言(第1-3部分)(原书第4版)》的质量,但篇幅上也会增加数百页。每个专家审阅人都建议增加技术细节、进阶示例和很多有用的开发规范;每个新手审阅人(或教育工作者)都建议增加示例;而大多数审阅人都(正确地)注意到《C++程序设计语言(第1-3部分)(原书第4版)》的篇幅可能过长了。
  感谢普林斯顿大学计算机科学系,特别感谢BrianKernighan教授,在我利用部分休假时间撰写此书时给予我热情接待。
  感谢剑桥大学计算机实验室,特别感谢AndyHopper教授,在我利用部分休假时间撰写此书时给予我热情接待。
  感谢我的编辑PeterGordon以及他在Addison-Wesley的出版团队,感谢你们的帮助和耐心。
  BjarneStroustrup于得克萨斯大学城第3版前言TheC++ProgrammingLanguageFourthEdition去编程就是去理解。
  ——KristenNygaard我觉得用C++编程比以往更令人愉快。在过去这些年里,C++在支持设计和编程方面取得了令人振奋的进步,针对其使用的大量新技术已经被开发出来了。然而,C++并不只是好玩。普通的程序员在几乎所有种类和规模的开发项目上,在生产率、可维护性、灵活性和质量方面都取得了显著的进步。到今天为止,C++已经实现了我当初期望中的绝大部分,还在许多我原来根本没有梦想过的工作中取得了成功。
  《C++程序设计语言(第1-3部分)(原书第4版)》介绍的是标准C++以及由C++所支持的关键编程技术和设计技术。与《C++程序设计语言(第1-3部分)(原书第4版)》第1版所介绍的那个C++版本相比,标准C++是一个经过了更仔细推敲的更强大的语言。各种新的语言特征,如名字空间、异常、模板,以及运行时类型识别,使人能以比过去更直接的方式使用许多技术,标准库使程序员能够从比基本语言高得多的层面上起步。
  《C++程序设计语言(第1-3部分)(原书第4版)》第2版中大约有三分之一的内容来自第1版。第3版则重写了更大的篇幅。它提供的许多东西是大部分有经验的程序员也需要的,与此同时,《C++程序设计语言(第1-3部分)(原书第4版)》也比它的以前版本更容易让新手入门。C++使用的爆炸性增长和由此带来的海量经验积累使这些成为可能。
  一个功能广泛的标准库定义使我能以一种与以前不同的方式介绍C++的各种概念。与过去一样,《C++程序设计语言(第1-3部分)(原书第4版)》对C++的介绍与任何特定的实现都没有关系;与过去一样,教材式的各章还是采用“自下而上”的方式,使每种结构都是在定义之后才使用。无论如何,使用一个设计良好的库远比理解其实现细节容易得多。因此,假定读者在理解标准库的内部工作原理之前,就可以利用它提供许多更实际、更有趣的例子。标准库本身也是程序设计示例和设计技术的丰富源泉。
  《C++程序设计语言(第1-3部分)(原书第4版)》将介绍每种主要的C++语言特征和标准库,它是围绕着语言和库功能组织起来的。当然,各种特征都将在使用它们的环境中介绍。也就是说,这里所关注的是将语言作为一种设计和编程的工具,而不是语言本身。《C++程序设计语言(第1-3部分)(原书第4版)》将展示那些使C++卓有成效的关键技术,讲述为掌握它们所需要的基本概念。除了专门阐释技术细节的那些地方之外,其他示例都取自系统软件领域。另一本与《C++程序设计语言(第1-3部分)(原书第4版)》配套出版的书《带标注的C++语言标准》(TheAnnotatedC++LanguageStandard),将给出完整的语言定义,所附标注能使它更容易理解。
  《C++程序设计语言(第1-3部分)(原书第4版)》的基本目标就是帮助读者理解C++所提供的功能将如何支持关键的程序设计技术。这里的目标是使读者能远远简单地复制示例并使之能够运行,或者模仿来自其他语言的程序设计风格。只有对隐藏在语言背后的思想有了很好的理解之后,才能真正掌握这个语言。如果有一些具体实现的文档的辅助,这里所提供的信息就足以对付具有挑战性的真实世界中的重要项目。我的希望是,《C++程序设计语言(第1-3部分)(原书第4版)》能帮助读者获得新的洞察力,使他们成为更好的程序员和设计师。
  致谢除了第1版和第2版的致谢中所提到的那些人之外,我还要感谢MattAustern、HansBoehm、DonCaldwell、LawrenceCrowl、AlanFeuer、AndrewForrest、DavidGay、TimGriffin、PeterJuhl、BrianKernighan、AndrewKoenig、MikeMowbray、RobMurray、LeeNackman、JosephNewcomer、AlexStepanov、DavidVandevoorde、PeterWeinberger和ChrisVanWyk,他们对第3版各章的初稿提出了许多意见。没有他们的帮助和建议,这《C++程序设计语言(第1-3部分)(原书第4版)》一定会更难理解,包含更多的错误,没有这么完整,当然也可能稍微短一点。
  我还要感谢C++标准化委员会的志愿者们,是他们完成了规模宏大的建设性工作,才使C++具有它今天这个样子。要罗列出每个人会有一点不公平,但一个也不提就更不公平,所以我想特别提及MikeBall、DagBrück、SeanCorfield、TedGoldstein、KimKnuttila、AndrewKoenig、DmitryLenkov、NathanMyers、MartinO’Riordan、TomPlum、JonathanShopiro、JohnSpicer、JerrySchwarz、AlexStepanov和MikeVilot,他们中的每个人都在C++及其标准库的某些方面直接与我合作过。
  在这《C++程序设计语言(第1-3部分)(原书第4版)》次印刷之后,许多人给我发来电子邮件,提出更正和建议。我已经在《C++程序设计语言(第1-3部分)(原书第4版)》的结构中响应了他们的建议,使后来出版的版本大为改善。将《C++程序设计语言(第1-3部分)(原书第4版)》翻译到各种语言的译者也提供了许多澄清性的意见。作为对这些读者的回应,我增加了附录D和附录E。让我借这个机会感谢他们之中特别有帮助的几位:DaveAbrahams、MattAustern、JanBielawski、JaninaMincerDaszkiewicz、AndrewKoenig、DietmarKühl、NicolaiJosuttis、NathanMyers、PaulE.Sevin?、AndyTenne-Sens、ShoichiUchida、Ping-Fai(Mike)Yang和DennisYelle。
  BjarneStroustrup于新泽西默里山第2版前言TheC++ProgrammingLanguageFourthEdition前路漫漫。
  ——BilboBaggins正如在《C++程序设计语言(第1-3部分)(原书第4版)》的第1版中所承诺的,C++为满足其用户的需要正在不断地演化。这一演化过程得益于许多有着极大的背景差异,在范围广泛的应用领域中工作的用户们的实际经验的指导。在第1版出版后的六年中,C++的用户群体扩大了不止百倍,人们学到了许多东西,发现了许多新技术并通过了实践的检验。这些技术中的一些也在这一版中有所反映。
  在过去六年里所完成的许多语言扩展,其基本宗旨就是将C++提升为一种服务于一般性的数据抽象和面向对象程序设计的语言,特别是提升为一个可编写高质量的用户定义类型库的工具。一个“高质量的库”是指这样的库,它以一个或几个方便、安全且高效的类的形式,给用户提供了一个概念。在这个环境中,安全意味着这个类在库的使用者与它的供方之间构成了一个特殊的类型安全的界面;高效意味着与手工写出的C代码相比,这种库的使用不会给用户强加明显的运行时间上或空间上的额外开销。
  《C++程序设计语言(第1-3部分)(原书第4版)》介绍的是完整的C++语言。从第1章到第10章是一个教材式的导引,第11章到第13章展现的是一个有关设计和软件开发问题的讨论,后包含了完整的C++参考手册。自然,在原来版本之后新加入的特征和变化已成为这个展示的有机组成部分。这些特征包括:经过精化后的重载解析规则和存储管理功能,以及访问控制机制、类型安全的连接、const和static成员函数、抽象类、多重继承、模板和异常处理。
  C++是一个通用的程序设计语言,其核心应用领域是广泛意义上的系统程序设计。此外,C++还被成功地用到许多无法称为系统程序设计的应用领域中。从摩登的小型计算机到大的超级计算机上,以及几乎所有操作系统上都有C++的实现。因此,《C++程序设计语言(第1-3部分)(原书第4版)》描述的是C++语言本身,并不想试着去解释任何特殊的实现、程序设计环境或者库。
  《C++程序设计语言(第1-3部分)(原书第4版)》中给出的许多类的示例虽然都很有用,但也还是应该归到“玩具”一类。与在完整的精益求精的程序中做解释相比,这里所采用的解说风格能更清晰地呈现那些具有普遍意义的原理和极其有用的技术,在实际例子中它们很容易被细节所淹没。这里给出的大部分有用的类,如链接表、数组、字符串、矩阵、图形类、关联数组等,在广泛可用的各种商品和非商品资源中,都有可用的“防弹”或“金盘”版本。那些“具有工业强度”的类和库中的许多东西,实际上不过是在这里可以找到的玩具版本的直接或间接后裔。
  与第1版相比,这一版更加强调《C++程序设计语言(第1-3部分)(原书第4版)》在教学方面的作用。然而,这里的叙述仍然是针对有经验的程序员,并努力不去轻视他们的智慧和经验。有关设计问题的讨论有了很大的扩充,作为对读者在语言特征及其直接应用之外的要求的一种回应。技术细节和精确性也有所增强。特别是,这里的参考手册体现了在这个方向上多年的工作。我的目标是提供一本具有足够深度的书籍,使大部分程序员能在多次阅读中都有所收获。换句话说,这《C++程序设计语言(第1-3部分)(原书第4版)》给出的是C++语言,它的基本原理,以及使用时所需要的关键性技术。欢迎欣赏!
  致谢除了在第1版前言的致谢里所提到的人们之外,我还要感谢AlAho、SteveBuroff、JimCoplien、TedGoldstein、TonyHansen、LorraineJuhl、PeterJuhl、BrianKernighan、AndrewKoenig、BillLeggett、WarrenMontgomery、MikeMowbray、RobMurray、JonathanShopiro、MikeVilot和PeterWeinberger,他们对第2版的初稿提出了许多意见。许多人对C++从1985年到1991年的开发有很大影响,我只能提及其中几个:AndrewKoenig,BrianKernighan,DougMcIlroy和JonathanShopiro。还要感谢参考手册“外部评阅”的许多参与者,以及在X3J16的整个年里一直在其中受苦的人们。
  BjarneStroustrup于新泽西默里山第1版前言TheC++ProgrammingLanguageFourthEdition语言磨砺了我们思维的方式,也决定着我们思考的范围。
  ——B.L.WhorfC++是一种通用的程序设计语言,其设计就是为了使认真的程序员工作得更愉快。除了一些小细节之外,C++是C程序设计语言的一个超集。C++提供了C所提供的各种功能,还为定义新类型提供了灵活而有效的功能。程序员可以通过定义新类型,使这些类型与应用中的概念紧密对应,从而把一个应用划分成许多容易管理的片段。这种程序构造技术通常被称为数据抽象。某些用户定义类型的对象包含着类型信息,这种对象就可以方便而安全地用在那种对象类型无法在编译时确定的环境中。使用这种类型的对象的程序通常被称为是基于对象的。如果用得好,这些技术可以产生出更短、更容易理解,而且也更容易管理的程序。
  C++里的关键概念是类。一个类就是一个用户定义类型。类提供了对数据的隐藏,数据的初始化保证,用户定义类型的隐式类型转换,动态类型识别,用户控制的存储管理,以及重载运算符的机制等。在类型检查和表述模块性方面,C++提供了比C好得多的功能。它还包含了许多并不直接与类相关的改进,包括符号常量、函数的在线替换、默认函数参数、重载函数名、自由存储管理运算符,以及引用类型等。C++保持了C高效处理硬件基本对象(位、字节、字、地址等)的能力。这就使用户定义类型能够在相当高的效率水平上实现。
  C++及其标准库也是为了可移植性而设计的。当前的实现能够在大多数支持C的系统上运行。C的库也能用于C++程序,而且大部分支持C程序设计的工具也同样能用于C++。
  《C++程序设计语言(第1-3部分)(原书第4版)》的基本目标就是帮助认真的程序员学习这个语言,并将它用于那些非平凡的项目。书中提供了有关C++的完整描述,许多完整的例子,以及更多的程序片段。
  致谢如果没有许多朋友和同事持之以恒的使用、建议和建设性的批评,C++绝不会像它现在这样成熟。特别地,TomCargill、JimCoplien、StuFeldman、SandyFraser、SteveJohnson、BrianKernighan、BartLocanthi、DougMcIlroy、DennisRitchie、LarryRosler、JerrySchwarz和JonShopiro对语言发展提供了重要的思想。DavePresotto写出了流I/O库的当前实现。
  此外,还有几百人对C++及其编译器的开发做出了贡献:给我提出改进的建议,描述所遇到的问题,告诉我编译中的错误等。我只能提及其中的很少几位:GaryBishop,AndrewHume,TomKarzes,VictorMilenkovic,RobMurray,LeonieRose,BrianSchmult和GaryWalker。
  许多人在《C++程序设计语言(第1-3部分)(原书第4版)》的撰写过程中为我提供了帮助,特别值得提出的是JonBentley、LauraEaves、BrianKernighan、TedKowalski、SteveMahaney、JonShopiro,以及参加1985年7月26~27日俄亥俄州哥伦布贝尔实验室C++课程的人们。
  BjarneStroustrup于新泽西默里山

其他推荐