C++语言导学(原书第2版)
作者 : [美]本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup) 著
译者 : 王刚 译
丛书名 : 计算机科学丛书
出版日期 : 2019-08-22
ISBN : 978-7-111-63328-0
定价 : 79.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 225
开本 : 16
原书名 : A Tour of C++,Second Edition
原出版社: Pearson Education Inc.
属性分类: 教材
包含CD : 无CD
绝版 :
图书简介

在《C++导学(第二版)》中,C++的创造者本贾尼•斯特劳斯特鲁普描述了现代C++语言的构成。这本简洁、自成体系的导引书籍包含了大多数主要C++语言特性和主要标准库组件——当然,并未深入介绍,而是给予程序员一个有意义的语言概述、一些关键的例子以及起步阶段的实用帮助。

图书特色

C++语言创造者所著,本书精确描述了现代C++语言的构成、本质与优点

图书前言

教而至简,不亦乐乎。
——西塞罗

现在的C++感觉就像是一种新的语言。与C++98相比,使用现在的C++我能更清晰、更简单、更直接地表达思想。而且,编译器可以更好地检查程序中的错误,程序的运行速度也提高了。
本书给出C++语言的一个概述,这里所说的C++是由当前的ISO C++标准C++17定义的,由主要的C++提供商实现。此外,本书还会介绍一些目前在使用的ISO技术规范定义的概念和模块,但它们在C++20尚无计划包含进标准中。
就像其他任何一种现代编程语言一样,C++规模庞大且提供了非常丰富的库,这是高效编程所需的。这本小册子的目的是让一个有经验的程序员快速了解现代C++语言,因此它覆盖了C++大多数主要的语言特性和标准库组件。读者花费几个小时就能读完这本书,但显然要想写出漂亮的C++程序绝非一日之功。好在本书的目的并非让读者熟练掌握一切,而只是给出一个概览,给出一些关键的例子,帮助读者开始自己的C++之旅。
假设读者已经拥有了一些编程经验。如果没有,建议你先找一本入门教材学习,比如《Programming: Principles and Practice Using C++,Second Edition》(C++程序设计原理与实践(第2版))[Stroustrup, 2014],然后再来学习本书。即便你曾经编写过程序,你使用的语言或者编写的应用也可能在风格或形式上与本书所介绍的C++相距甚远。
我们用城市观光的例子来说明本书的作用,比如游览哥本哈根或者纽约。在短短几个小时之内,你可能会匆匆游览几个主要的景点,听一些有趣的传说或故事,然后听取建议接下来做什么。仅靠这样一段旅程,你无法真正了解这座城市,也无法完全理解听到和看到的东西,更无法熟悉这座城市正式的和非正式的生存法则。毕竟想要真正了解一座城市,你必须生活在其中,而且往往需要多年。不过如果幸运的话,此时你已经对城市的概貌有了一些了解,知道了它的某些特殊之处,并且对某些方面产生了兴趣。在这段旅程之后,你就可以开始真正的探索了。
本书的风格就像这段旅程,它会为你介绍C++语言的主要特性,这是按其所支持的程序设计风格来呈现的,例如面向对象编程和泛型编程。本书不准备提供一个详细的、手册式的、逐条特性的C++语言描述。遵循优秀教科书的传统,我努力在使用每个语言特性之前对其进行解释,但实际情况并不总能允许我这样做,而且并不是每个人都会严格按顺序阅读本书。因此,我鼓励读者使用交叉引用和索引。
类似地,本书以示例的方式介绍标准库,而非逐一列举标准库特性。本书没有介绍ISO标准之外的库,读者需要的话可以查阅相关资料,例如[Stroustrup, 2013]和[Stroustrup, 2014],网络上也有大量(质量参差不齐)的其他资料,如[Cppreference]。例如,当我提到一个标准库函数或类时,很容易就能找到它的定义,并且通过查找其文档,能找到很多相关的资料。
本书力求把C++作为一个整体呈现在读者面前,而非像千层糕一样逐层地介绍。因此,本书不细分某个语言特性是属于C、C++98的一部分还是新的C++11、C++14或C++17。这种信息可在第16章(历史和兼容性)中找到。本书聚焦基础并力求简洁,但也未能完全抵抗过度阐述新特性的诱惑。这看起来也满足了很多已经了解旧版本C++的读者的好奇心。
一本程序设计语言参考手册或标准会简单陈述可以做什么,但程序员通常对学习如何用好语言更感兴趣。达到这个目的一方面要靠主题的选择,另一方面要靠文字的组织,特别是建议部分。关于优秀的现代C++语言是怎样构成的更多建议可在《C++ Core Guidelines》(C++核心准则)[Stroustrup, 2015]一书中找到。对于希望继续深入探索本书介绍的思想的读者,这是一本很好的书。你可能注意到了,《C++ Core Guidelines》和本书在建议的呈现上甚至建议的编号方式上都惊人地相似。其中一个原因是本书第1版是最初的《C++ Core Guidelines》的主要参考资源。
致谢
本书的一些内容源自《C++程序设计语言(第4版)》(TC++PL4)[Stroustrup, 2013],因此要感谢帮助我完成TC++PL4的所有同仁。
感谢帮助我完成并校对本书第1版的所有同仁。
感谢Morgan Stanley给予我时间进行本书的写作。感谢哥伦比亚大学2018年春季课程“使用C++设计程序”的所有学生找出了本书最初草稿中的很多拼写问题和错误并给出了很多建设性的意见。
感谢Paul Anderson、Chuck Allison、Peter Gottschling、William Mons、Charles Wilson和Sergey Zubkov审阅了本书并给出了很多改进建议。

本贾尼·斯特劳斯特鲁普
曼哈顿,纽约

上架指导

计算机\程序设计

封底文字

在本书中,C++的创造者本贾尼•斯特劳斯特鲁普描述了现代C++语言的构成。这本简洁、自成体系的导引书籍包含了C++语言大多数主要特性和标准库组件。当然,并未深入介绍,而是给予程序员一个有意义的语言概述、一些关键的例子以及起步阶段的实用帮助。
本书通过介绍编程风格(例如面向对象编程和泛型编程)引出支持它们的C++特性。从基本特性开始,延伸到更宽范的进阶主题,包括很多C++17新特性,例如移动语义、一致初始化、lambda表达式、改进的容器、随机数以及并发。本书非常全面,甚至包含一些为C++20提出的扩展,例如概念和模块。本书最后讨论了C++语言的设计和演化。
这本C++导引书籍的目标不是教你如何编程(如果出于这一目的,请参阅作者所著的《C++程序设计原理与实践(第2版)》),它也不可能是你精通C++的唯一资源(如果出于这一目的,请参阅作者所著的《C++程序设计语言(第4版)》以及推荐的在线资源)。但是,如果你是一名C或C++程序员,希望更加熟悉现在的C++语言,或者你是一名精通其他语言的程序员,希望获得有关现代C++语言本质和优点的精确描述,你不可能找到比本书更短或更简单的介绍了。

译者序

C++是一门经典的程序设计语言。
Bjarne Stroustrup是C++的设计者、最初的实现者和ISO标准的主要制定者。
《A Tour of C++》是Bjarne Stroustrup推出的一本能令有经验的程序员快速了解现代C++语言的小册子。与作者的其他著作相比,本书有三个特点。一是“新”:本书以快速导览的形式介绍C++,是作者的一次新的尝试。从写作手法、章节组织到示例选取都力图推陈出新,一改语言类书籍教条枯燥的通病,文字间洋溢着新意。作为第2版,在内容选取、结构组织上较之前的第1版进行了全面更新。二是“薄”:本书篇幅短小,每个主题多则二三十页少则十余页即叙述完成,不论随身携带或者置于案头,读者都可以在较短时间内读完本书并从中受益。三是“精”:本书的文字虽少,内容却不少,甚至可以说非常丰富。不但涉及C++的绝大多数语言特性以及重要的标准库组件,而且涵盖了C++17标准及未来的C++20标准中的很多新内容。
在翻译过程中我们有这样一个体会,与其说作者在书中介绍一些语法和技术,不如说他在传递思想。传递他在发明、设计和不断完善C++语言的过程中的所思和所虑;当思想和编程实践产生碰撞时,他又基于丰富的实践经验给出了非常中肯的建议。
很多学习者和程序员常常会有这样的疑问:C++是什么?读完本书,相信你会得到满意的答案。
由于时间紧促且译者水平有限,书中的不当之处恳请广大读者批评指正。

2019年夏
于南开园

图书目录

出版者的话
译者序
前言
第1章 基础知识 1
1.1 引言 1
1.2 程序 1
1.3 函数 3
1.4 类型、变量和算术运算 4
1.4.1 算术运算 5
1.4.2 初始化 6
1.5 作用域和生命周期 7
1.6 常量 8
1.7 指针、数组和引用 9
1.8 检验 12
1.9 映射到硬件 14
1.9.1 赋值 14
1.9.2 初始化 15
1.10 建议 16
第2章 用户自定义类型 18
2.1 引言 18
2.2 结构 18
2.3 类 20
2.4 联合 21
2.5 枚举 22
2.6 建议 23
第3章 模块化 25
3.1 引言 25
3.2 分别编译 26
3.3 模块(C++20) 27
3.4 名字空间 29
3.5 错误处理 30
3.5.1 异常 30
3.5.2 不变式 32
3.5.3 错误处理替代 33
3.5.4 合约 35
3.5.5 静态断言 35
3.6 函数参数和返回值 36
3.6.1 参数传递 36
3.6.2 返回值 37
3.6.3 结构化绑定 39
3.7 建议 40
第4章 类 41
4.1 引言 41
4.2 具体类型 42
4.2.1 一种算术类型 42
4.2.2 容器 44
4.2.3 初始化容器 45
4.3 抽象类型 47
4.4 虚函数 49
4.5 类层次 50
4.5.1 层次结构的益处 52
4.5.2 层次漫游 53
4.5.3 避免资源泄漏 54
4.6 建议 55
第5章 基本操作 57
5.1 引言 57
5.1.1 基本操作 57
5.1.2 类型转换 59
5.1.3 成员初始值 59
5.2 拷贝和移动 60
5.2.1 拷贝容器 60
5.2.2 移动容器 62
5.3 资源管理 63
5.4 常规操作 65
5.4.1 比较 65
5.4.2 容器操作 65
5.4.3 输入输出操作 66
5.4.4 用户自定义字面值 66
5.4.5 swap() 67
5.4.6 hash<> 67
5.5 建议 67
第6章 模板 69
6.1 引言 69
6.2 参数化类型 69
6.2.1 约束模板参数(C++20) 71
6.2.2 值模板参数 71
6.2.3 模板参数推断 72
6.3 参数化操作 73
6.3.1 函数模板 73
6.3.2 函数对象 74
6.3.3 lambda表达式 75
6.4 模板机制 77
6.4.1 可变参数模板 78
6.4.2 别名 78
6.4.3 编译时if 79
6.5 建议 80
第7章 概念和泛型编程 81
7.1 引言 81
7.2 概念(C++20) 81
7.2.1 概念的使用 82
7.2.2 基于概念的重载 83
7.2.3 合法代码 84
7.2.4 概念的定义 84
7.3 泛型编程 86
7.3.1 概念的使用 86
7.3.2 使用模板抽象 86
7.4 可变参数模板 88
7.4.1 表达式折叠 89
7.4.2 参数转发 90
7.5 模板编译模型 90
7.6 建议 91
第8章 标准库概览 92
8.1 引言 92
8.2 标准库组件 92
8.3 标准库头文件和名字空间 93
8.4 建议 94
第9章 字符串和正则表达式 95
9.1 引言 95
9.2 字符串 95
9.3 字符串视图 97
9.4 正则表达式 99
9.4.1 搜索 99
9.4.2 正则表达式符号表示 100
9.4.3 迭代器 104
9.5 建议 104
第10章 输入输出 106
10.1 引言 106
10.2 输出 107
10.3 输入 108
10.4 I/O状态 109
10.5 用户自定义类型的I/O 110
10.6 格式化 111
10.7 文件流 112
10.8 字符串流 112
10.9 C风格I/O 113
10.10 文件系统 114
10.11 建议 117
第11章 容器 119
11.1 引言 119
11.2 vector 119
11.2.1 元素 121
11.2.2 范围检查 122
11.3 list 123
11.4 map 125
11.5 unordered_map 125
11.6 容器概述 127
11.7 建议 128
第12章 算法 130
12.1 引言 130
12.2 使用迭代器 131
12.3 迭代器类型 133
12.4 流迭代器 134
12.5 谓词 136
12.6 算法概述 136
12.7 概念(C++20) 137
12.8 容器算法 140
12.9 并行算法 140
12.10 建议 141
第13章 实用功能 142
13.1 引言 142
13.2 资源管理 142
13.2.1 unique_ptr和shared_ptr 143
13.2.2 move()和forward() 145
13.3 范围检查:span 147
13.4 特殊容器 148
13.4.1 array 149
13.4.2 bitset 150
13.4.3 pair和tuple 151
13.5 选择 152
13.5.1 variant 153
13.5.2 optional 154
13.5.3 any 155
13.6 分配器 155
13.7 时间 156
13.8 函数适配器 157
13.8.1 lambda作为适配器 157
13.8.2 mem_fn() 157
13.8.3 function 158
13.9 类型函数 158
13.9.1 iterator_traits 159
13.9.2 类型谓词 161
13.9.3 enable_if 161
13.10 建议 162
第14章 数值 163
14.1 引言 163
14.2 数学函数 163
14.3 数值算法 164
14.4 复数 165
14.5 随机数 166
14.6 向量算术 167
14.7 数值限制 168
14.8 建议 168
第15章 并发 169
15.1 引言 169
15.2 任务和thread 169
15.3 传递参数 170
15.4 返回结果 171
15.5 共享数据 172
15.6 等待事件 173
15.7 任务通信 175
15.7.1 future和promise 175
15.7.2 packaged_task 176
15.7.3 async() 177
15.8 建议 178
第16章 历史和兼容性 180
16.1 历史 180
16.1.1 大事年表 181
16.1.2 早期的C++ 182
16.1.3 ISO C++标准 184
16.1.4 标准和编程风格 186
16.1.5 C++的应用 186
16.2 C++特性演化 186
16.2.1 C++11语言特性 187
16.2.2 C++14语言特性 188
16.2.3 C++17语言特性 188
16.2.4 C++11标准库组件 188
16.2.5 C++14标准库组件 189
16.2.6 C++17标准库组件 189
16.2.7 已弃用特性 190
16.3 C/C++兼容性 190
16.3.1 C和C++是兄弟 191
16.3.2 兼容性问题 192
16.4 参考文献 193
16.5 建议 196
索引 198

教学资源推荐
作者: [美]基普·欧文(Kip Irvine) 著
作者: [美]布莱恩· W.克尼汉(Brian W. Kernighan),丹尼斯· M.里奇(Dennis M.Ritchie) 著
作者: 刘奇志 尹存燕 曹迎春 编著
作者: (美)Y.Daniel Liang 著 阿姆斯特朗亚特兰大州立大学
参考读物推荐
作者: (美)Eric Rochester 著
作者: [美]罗伯特 C.西科德(Robert C. Seacord)著
作者: [美] 珍妮弗·尼德斯特·罗宾斯(Jennifer Niederst Robbins)著