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

C++程序设计语言(第4部分:标准库)(原书第4版)
作者 : (美)本贾尼·斯特劳斯特鲁普 (Bjarne Stroustrup)著
译者 : 王刚 杨巨峰 译
丛书名 : 计算机科学丛书
出版日期 : 2016-09-08
ISBN : 978-7-111-54439-5
定价 : 89.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 369
开本 : 16
原书名 : The C++ Programming Language, Fourth Edition
原出版社: Pearson Education Asia
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

图书特色

C++语言之父的经典名著之最新版本,全面掌握标准C++11及其编程技术的权威指南!
第1版1985年,第2版1991年,第3版1997年,特别版2000年,第4版2013年,经典无限延伸……

本书是在C++语言和程序设计领域具有深远影响、畅销不衰的经典著作,由C++语言的设计者和最初的实现者Bjarne Stroustrup编写,对C++语言进行了最全面、最权威的论述,覆盖标准C++以及由C++所支持的关键编程技术和设计技术。本书英文原版一经面世,即引起业内人士的高度评价和热烈欢迎,先后被翻译成德、希、匈、西、荷、法、日、俄、中、韩等近20种语言,数以百万计的程序员从中获益,是无可取代的C++经典力作。
新的C++11标准使得程序员能以更清晰、更简明、更直接的方式表达思想,从而编写出更快速和高效的代码。在最新出版的第4版中,Stroustrup博士针对最新的C++11标准,为所有希望更有效使用C++语言编程的程序员重新组织、扩展和全面重写了这本C++语言的权威参考书和学习指南,细致、全面、综合地阐述了C++语言及其基本特性、抽象机制、标准库和关键设计技术。

新的C++11标准的内容包括
支持并发处理。
正则表达式、资源管理指针、随机数、改进的容器(包括哈希表)以及其他很多特性。
通用和一致的初始化机制、更简单的for语句、移动语义、基础的Unicode支持。
lambda表达式、通用常量表达式、控制类缺省定义的能力、可变参数模板、模板别名、用户定义的字面值常量。
兼容性问题。


本贾尼·斯特劳斯特鲁普
(Bjarne Stroustrup)
C++语言的设计者和最初实现者,C++语言ISO标准化工作的积极参与者,同时也是《C++程序设计语言》和《C++程序设计原理与实践》的作者。他是英国剑桥大学计算机科学专业博士,1979年加入美国新泽西贝尔实验室,从成立到2002年一直担任贝尔实验室大规模程序设计研究部门的负责人。2002年至2014年,Bjarne被评为德州农工大学工程学院计算机科学首席教授,哥伦比亚大学计算机科学系客座教授,德州农工大学计算机科学系杰出研究教授。多年来,他为剑桥大学、哥伦比亚大学和普林斯顿大学等知名学府的计算机科学教学事业倾注了大量的热情和精力。商业领域方面,Bjarne是RollApp 科技公司的资深顾问。2014年,Bjarne加入摩根士丹利纽约总部,任职技术与数据部门的董事总经理。他是美国国家工程院院士、IEEE会士和ACM会士,研究兴趣包括分布式系统设计、程序设计技术、软件开发工具和程序设计语言。


图书前言

所有计算机科学问题,
都可以通过引入一个新的间接层次来解决,
那些已有过多间接层次的问题除外。
——David J. Wheeler

与C++98标准相比,C++11标准让我可以更清晰、更简洁而且更直接地表达自己的想法。而且,新版本的编译器可以对程序进行更好的检查并生成更快的目标程序。因此,C++11给人的感觉就像是一种新语言一样。
在本书中,我追求完整性(completeness)。我会介绍专业程序员可能需要的每个语言特性和标准库组件。对每个特性或组件,我将给出:
基本原理:设计这个特性(组件)是为了帮助解决哪类问题?其设计原理是什么?它有什么根本的局限?
规范:它该如何定义?我将以专业程序员为目标读者来选择内容的详略程度,对于要求更高的C++语言研究者,有很多ISO标准的文献可供查阅。
例子:当单独使用这个特性或与其他特性组合使用时,如何用好它?其中的关键技术和习惯用法是怎样的?在程序的可维护性和性能方面是否有一些隐含的问题?
多年来,无论是C++语言本身还是它的使用,都已经发生了巨大改变。从程序员的角度,大多数改变都属于语言的改进。与之前的版本相比,当前的ISO C++标准(ISO/IEC 14882-2011,通常称为C++11)在编写高质量代码方面无疑是一个好得多的工具。但是它好在哪里?现代C++语言支持什么样的程序设计风格和技术?这些技术靠哪些语言特性和标准库特性来支撑?精练、正确、可维护性好、性能高的C++代码的基本构建单元是怎样的?本书将回答这些关键问题。很多答案已经不同于1985、1995或2005等旧版本的C++语言了:C++在进步。
C++是一种通用程序设计语言,它强调富类型、轻量级抽象的设计和使用。C++特别适合开发资源受限的应用,例如可在软件基础设施中发现的那些应用。那些花费时间学习高质量代码编写技术的程序员将会从C++语言受益良多。C++是为那些严肃对待编程的人而设计的。人类文明已经严重依赖软件,编写高质量的软件非常重要。
目前已经部署的C++代码达到数十亿行,因此程序稳定性备受重视——很多1985年和1995年编写的C++代码仍然运行良好,而且还会继续运行几十年。但是,对所有这些应用程序,都可以用现代C++语言写出更好的版本;如果你墨守成规,将来写出的代码将会是低质量、低性能的。对稳定性的强调还意味着,你现在遵循标准写出的代码,在未来几十年中会运行良好。本书中所有代码都遵循2011 ISO C++标准。
本书面向三类读者:
想知道最新的ISO C++标准都提供了哪些新特性的C++程序员。
好奇C++到底提供了哪些超越C语言的特性的C程序员。
具备Java、C#、Python和Ruby等编程语言背景,正在探寻“更接近机器”的语言,即更灵活、提供更好的编译时检查或是更好性能的语言的程序员。
自然,这三类读者可能是有交集的——一个专业软件开发者通常掌握多门编程语言。
本书假定目标读者是程序员。如果你想问“什么是for循环?”或是“什么是编译器?”,那么本书现在还不适合你,我向你推荐我的另一本书《C++程序设计原理与实践》,这本书适合作为程序设计和C++语言的入门书籍。而且,我假定读者是较为成熟的软件开发者。如果你的问题是“为什么要费力进行测试?”或者认为“所有语言基本都是一样的,给我看语法就可以了”,甚至确信存在一种适合所有任务的完美语言,那么本书也不适合你。
相对于C++98,C++11提出了哪些改进和新特性呢?适合现代计算机的机器模型会涉及大量并发处理。为此,C++11提供了用于系统级并行编程(如使用多核)的语言和标准库特性。C++11还提供了正则表达式处理、资源管理指针、随机数、改进的容器(包括哈希表)以及其他很多特性。此外,C++11还提供了通用和一致的初始化机制、更简单的for语句、移动语义、基础的Unicode支持、lambda表达式、通用常量表达式、控制类缺省定义的能力、可变参数模板、用户定义的字面值常量和其他很多新特性。请记住,这些标准库和语言特性的目标就是支撑那些用来开发高质量软件的程序设计技术。这些特性应该组合使用——将它们看作盖大楼的砖,而不应该相互隔离地单独使用来解决特定问题。计算机是一种通用机器,而C++在其中起着重要作用。特别是,C++的设计目标就是足够灵活和通用,以便处理那些连它的设计者都未曾想象过的未来难题。
致谢
除了本书上一版致谢提及的人之外,我还要感谢Pete Becker、Hans-J. Boehm、Marshall Clow、Jonathan Coe、Lawrence Crowl、Walter Daugherty、J. Daniel Garcia、Robert Harle、Greg Hickman、Howard Hinnant、Brian Kernighan、Daniel Krügler、Nevin Liber、Michel Michaud、Gary Powell、Jan Christiaan van Winkel和Leor Zolman。没有他们的帮助,本书的质量要差得多。
感谢Howard Hinnant为我解答很多有关标准库的问题。
Andrew Sutton是Origin库的作者,模板相关章节中很多模拟概念的讨论都是基于这个测试平台的。他还是Matrix库的作者,这是第29章的主题。Origin库是开源的,在互联网上搜索“Origin”和“Andrew Sutton”就能找到。
感谢我指导的毕业设计班,他们从第一部分中找出的问题比其他任何人都多。
假如我能遵照审阅人的所有建议,毫无疑问会大幅度提高本书的质量,但篇幅上也会增加数百页。每个专家审阅人都建议增加技术细节、进阶示例和很多有用的开发规范;每个新手审阅人(或教育工作者)都建议增加示例;而大多数审阅人都(正确地)注意到本书的篇幅可能过长了。
感谢普林斯顿大学计算机科学系,特别感谢Brian Kernighan教授,在我利用部分休假时间撰写此书时给予我热情接待。
感谢剑桥大学计算机实验室,特别感谢Andy Hopper教授,在我利用部分休假时间撰写此书时给予我热情接待。
感谢编辑Peter Gordon以及他在Addison-Wesley的出版团队,感谢你们的帮助和耐心。

Bjarne Stroustrup
于得克萨斯大学城

上架指导

计算机\程序设计

封底文字

C++语言之父的经典名著之最新版本,全面掌握标准C++11及其编程技术的权威指南!
第1版1985年,第2版1991年,第3版1997年,特别版2000年,第4版2013年,经典无限延伸……

本书是在C++语言和程序设计领域具有深远影响、畅销不衰的经典著作,由C++语言的设计者和最初的实现者Bjarne Stroustrup编写,对C++语言进行了最全面、最权威的论述,覆盖标准C++以及由C++所支持的关键编程技术和设计技术。本书英文原版一经面世,即引起业内人士的高度评价和热烈欢迎,先后被翻译成德、希、匈、西、荷、法、日、俄、中、韩等近20种语言,数以百万计的程序员从中获益,是无可取代的C++经典力作。

新的C++11标准使得程序员能以更清晰、更简明、更直接的方式表达思想,从而编写出更快速和高效的代码。在最新出版的第4版中,Stroustrup博士针对最新的C++11标准,为所有希望更有效使用C++语言编程的程序员重新组织、扩展和全面重写了这本C++语言的权威参考书和学习指南,细致、全面、综合地阐述了C++语言及其基本特性、抽象机制、标准库和关键设计技术。

新的C++11标准的内容包括:
 支持并发处理。
 正则表达式、资源管理指针、随机数、改进的容器(包括哈希表)以及其他很多特性。
 通用和一致的初始化机制、更简单的for语句、移动语义、基础的Unicode支持。
 lambda表达式、通用常量表达式、控制类缺省定义的能力、可变参数模板、模板别名、用户定义的字面值常量。
 兼容性问题。

本贾尼•斯特劳斯特卢普(Bjarne Stroustrup) C++语言的设计者和最初实现者,C++语言ISO标准化工作的积极参与者,同时也是《C++程序设计语言》和《C++程序设计原理与实践》的作者。他是英国剑桥大学计算机科学专业博士,1979年加入美国新泽西贝尔实验室,从成立到2002年一直担任贝尔实验室大规模程序设计研究部门的负责人。2002~2014年,Bjarne 被评为德州农工大学工程学院计算机科学首席教授,哥伦比亚大学计算机科学系客座教授,德州农工大学计算机科学系杰出研究教授。多年来,他为剑桥大学、哥伦比亚大学和普林斯顿大学等知名学府的计算机科学教学事业倾注了大量的热情和精力。商业领域方面,Bjarne 是RollApp 科技公司的资深顾问。2014年,Bjarne加入摩根士丹利纽约总部,任职技术与数据部门的董事总经理。他是美国国家工程院院士、IEEE会士和ACM会士,研究兴趣包括分布式系统、设计、程序设计技术、软件开发工具和程序设计语言。

译者简介

王刚 杨巨峰 译:暂无简介

译者序

历时近两年,终于翻译完了《C++程序设计语言》(原书第4版)。全书包含44章,英文原版共有1300多页,是C++语言之父Bjarne Stroustrup的一部呕心沥血之作。
这部巨著有几个特点:
一是知识结构完整,对C++语言的介绍非常全面。作者按照“基本功能”→“抽象机制”→“标准库”的递进层次组织全书,由浅入深地把C++语言的方方面面呈现在读者的面前。各种水平、各种背景的读者都能在书中找到适合自己的切入点和学习路径。
二是对细节的讲解非常深入,有利于读者了解和掌握语言的精华。作为C++语言的发明者和主要维护者,Bjarne Stroustrup在撰写本书时绝不仅仅满足于阐明语法和知识点本身。他试图向读者揭示各个语言功能的设计初衷,以及他对各种制约因素是如何考虑并妥协的。对于大多数读者来说,这种视角新奇而有趣。他们不再只是被动的学习者,在知道了“是什么”和“为什么”之后,还可以大胆地揣测“C++语言接下来该如何继续发展”。不得不说,这是本书与其他C++书籍的最大区别。
三是作者在写作中融入了很多自己的工程实践经验。学习程序设计语言与学习文化课有很大的不同。设计程序的过程是一门艺术,程序语言只是完成艺术作品所需的工具。举个例子来说,由于各种各样的原因,在C++中存在一些语言特性,它们的功能和作用非常类似。那么这些特性之间是何关系?在遇到某类实际问题时应该如何聪明地选择?本书很好地回答了此类问题。
以译者的浅见,程序员应该是艺术家(Artist),而非匠人(Worker)——后者只会堆砌代码,而前者能创造出美好的作品。这也应该是Bjarne Stroustrup写作本书时所追求的吧!
这本译著的出版凝结了很多人的智慧和心血,绝非译者二人独力可为。感谢机械工业出版社的朱劼、关敏等编辑在本书译校和出版过程中的辛勤付出,她们给予了我们很多无私的帮助。由于译者水平有限,书中难免有一些不当之处,恳请读者不吝批评指正。

译者
2016年春于南开园

图书目录

出版者的话
译者序
前言
第3版前言
第2版前言
第1版前言
第四部分 标准库
第30章 标准库概览 2
30.1 引言 2
30.1.1 标准库设施 2
30.1.2 设计约束 4
30.1.3 描述风格 4
30.2 头文件 5
30.3 语言支持 9
30.3.1 initializer_list支持 9
30.3.2 范围for支持 10
30.4 错误处理 10
30.4.1 异常 10
30.4.2 断言 14
30.4.3 system_error 15
30.5 建议 23
第31章 STL容器 24
31.1 引言 24
31.2 容器概览 24
31.2.1 容器表示 27
31.2.2 对元素的要求 28
31.3 操作概览 30
31.3.1 成员类型 32
31.3.2 构造函数、析构函数和赋值操作 33
31.3.3 大小和容量 34
31.3.4 迭代器 35
31.3.5 元素访问 36
31.3.6 栈操作 36
31.3.7 列表操作 37
31.3.8 其他操作 38
31.4 容器 38
31.4.1 vector 38
31.4.2 链表 42
31.4.3 关联容器 44
31.5 容器适配器 53
31.5.1 stack 54
31.5.2 queue 55
31.5.3 priority_queue 56
31.6 建议 57
第32章 STL算法 59
32.1 引言 59
32.2 算法 59
32.2.1 序列 60
32.3 策略实参 61
32.3.1 复杂性 62
32.4 不修改序列的算法 63
32.4.1 for_each() 63
32.4.2 序列谓词 63
32.4.3 count() 63
32.4.4 find() 64
32.4.5 equal()和mismatch() 64
32.4.6 search() 65
32.5 修改序列的算法 66
32.5.1 copy() 66
32.5.2 unique() 67
32.5.3 remove()和replace() 68
32.5.4 rotate()、random_shuffle()和partition() 69
32.5.5 排列 70
32.5.6 fill() 70
32.5.7 swap() 71
32.6 排序和搜索 71
32.6.1 二分搜索 74
32.6.2 merge() 75
32.6.3 集合算法 75
32.6.4 堆 76
32.6.5 lexicographical_compare() 77
32.7 最大值和最小值 78
32.8 建议 79
第33章 STL迭代器 80
33.1 引言 80
33.1.1 迭代器模型 80
33.1.2 迭代器类别 81
33.1.3 迭代器萃取 82
33.1.4 迭代器操作 85
33.2 迭代器适配器 85
33.2.1 反向迭代器 86
33.2.2 插入迭代器 88
33.2.3 移动迭代器 89
33.3 范围访问函数 89
33.4 函数对象 90
33.5 函数适配器 91
33.5.1 bind() 92
33.5.2 mem_fn() 93
33.5.3 function 93
33.6 建议 95
第34章 内存和资源 96
34.1 引言 96
34.2 “拟容器” 96
34.2.1 array 97
34.2.2 bitset 99
34.2.3 vector 103
34.2.4 元组 104
34.3 资源管理指针 107
34.3.1 unique_ptr 108
34.3.2 shared_ptr 111
34.3.3 weak_ptr 113
34.4 分配器 115
34.4.1 默认分配器 116
34.4.2 分配器萃取 118
34.4.3 指针萃取 119
34.4.4 限域的分配器 119
34.5 垃圾收集接口 121
34.6 未初始化内存 123
34.6.1 临时缓冲区 123
34.6.2 raw_storage_iterator 124
34.7 建议 125
第35章 工具 126
35.1 引言 126
35.2 时间 126
35.2.1 duration 127
35.2.2 time_point 129
35.2.3 时钟 131
35.2.4 时间萃取 132
35.3 编译时有理数运算 132
35.4 类型函数 134
35.4.1 类型萃取 134
35.4.2 类型生成器 138
35.5 其他工具 142
35.5.1 move()和forward() 142
35.5.2 swap() 143
35.5.3 关系运算符 143
35.5.4 比较和哈希type_info 144
35.6 建议 145
第36章 字符串 146
36.1 引言 146
36.2 字符分类 146
36.2.1 分类函数 146
36.2.2 字符萃取 147
36.3 字符串 148
36.3.1 string与C风格字符串 149
36.3.2 构造函数 151
36.3.3 基本操作 152
36.3.4 字符串I/O 153
36.3.5 数值转换 154
36.3.6 类STL操作 155
36.3.7 find系列函数 157
36.3.8 子串 158
36.4 建议 159
第37章 正则表达式 160
37.1 正则表达式 160
37.1.1 正则表达式符号表示 161
37.2 regex 165
37.2.1 匹配结果 166
37.2.2 格式化 169
37.3 正则表达式函数 170
37.3.1 regex_match() 170
37.3.2 regex_search() 171
37.3.3 regex_replace() 172
37.4 正则表达式迭代器 173
37.4.1 regex_iterator 173
37.4.2 regex_token_iterator 175
37.5 regex_traits 176
37.6 建议 177
第38章 I/O流 178
38.1 引言 178
38.2 I/O流层次 180
38.2.1 文件流 180
38.2.2 字符串流 182
38.3 错误处理 183
38.4 I/O操作 184
38.4.1 输入操作 185
38.4.2 输出操作 187
38.4.3 操纵符 189
38.4.4 流状态 190
38.4.5 格式化 194
38.5 流迭代器 200
38.6 缓冲 201
38.6.1 输出流和缓冲区 204
38.6.2 输入流和缓冲区 205
38.6.3 缓冲区迭代器 205
38.7 建议 207
第39章 区域设置 209
39.1 处理文化差异 209
39.2 类locale 211
39.2.1 命名locale 213
39.2.2 比较string 216
39.3 类facet 217
39.3.1 访问locale中的facet 218
39.3.2 一个简单的用户自定义facet 218
39.3.3 locale和facet的使用 221
39.4 标准facet 221
39.4.1 string比较 223
39.4.2 数值格式化 226
39.4.3 货币格式化 231
39.4.4 日期和时间格式化 235
39.4.5 字符分类 238
39.4.6 字符编码转换 241
39.4.7 消息 244
39.5 便利接口 248
39.5.1 字符分类 248
39.5.2 字符转换 248
39.5.3 字符串转换 249
39.5.4 缓冲区转换 250
39.6 建议 250
第40章 数值计算 252
40.1 引言 252
40.2 数值限制 252
40.2.1 数值限制宏 255
40.3 标准数学函数 255
40.4 复数complex 257
40.5 数值数组:valarray 258
40.5.1 构造函数和赋值操作 258
40.5.2 下标操作 260
40.5.3 运算 261
40.5.4 切片 263
40.5.5 slice_array 265
40.5.6 推广切片 265
40.6 推广数值算法 267
40.6.1 accumulate() 267
40.6.2 inner_product() 268
40.6.3 partial_sum()和adjacent_difference() 269
40.6.4 iota() 270
40.7 随机数 270
40.7.1 引擎 272
40.7.2 随机设备 274
40.7.3 分布 274
40.7.4 C风格随机数 277
40.8 建议 278
第41章 并发 279
41.1 引言 279
41.2 内存模型 280
41.2.1 内存位置 281
41.2.2 指令重排 282
41.2.3 内存序 282
41.2.4 数据竞争 283
41.3 原子性 285
41.3.1 atomic类型 287
41.3.2 标志和栅栏 291
41.4 volatile 292
41.5 建议 292
第42章 线程和任务 293
42.1 引言 293
42.2 线程 293
42.2.1 身份 294
42.2.2 构造 295
42.2.3 析构 296
42.2.4 join() 297
42.2.5 detach() 298
42.2.6 名字空间this_thread 299
42.2.7 杀死thread 300
42.2.8 thread_local数据 300
42.3 避免数据竞争 302
42.3.1 互斥量 302
42.3.2 多重锁 309
42.3.3 call_once() 311
42.3.4 条件变量 311
42.4 基于任务的并发 315
42.4.1 future和promise 316
42.4.2 promise 317
42.4.3 packaged_task 318
42.4.4 future 320
42.4.5 shared_future 323
42.4.6 async() 323
42.4.7 一个并行find()示例 325
42.5 建议 328
第43章 C标准库 330
43.1 引言 330
43.2 文件 330
43.3 printf()系列函数 331
43.4 C风格字符串 334
43.5 内存 335
43.6 日期和时间 336
43.7 杂项 339
43.8 建议 340
第44章 兼容性 341
44.1 引言 341
44.2 C++11扩展 341
44.2.1 语言特性 341
44.2.2 标准库组件 343
44.2.3 弃用特性 344
44.2.4 应对旧版本C++实现 344
44.3 C/C++兼容性 345
44.3.1 C和C++是兄弟 345
44.3.2 “静默”差异 346
44.3.3 不兼容C++的C代码 347
44.3.4 不兼容C的C++代码 350
44.4 建议 351

教学资源推荐
作者: 刘冰 张林 蒋贵全 杨勇 编著
作者: 杨树林 胡洁萍 编著
作者: (美)Maurice Herlihy 布朗大学 Nir Shavit 麻省理工学院 著
参考读物推荐
作者: 杨洁 郭占鑫 刘康 熊谱翔 著
作者: 满硕泉 著
作者: (美)Borland公司