C++之旅(第3版)(英文版)
  • 推荐0
  • 收藏0
  • 浏览133

C++之旅(第3版)(英文版)

【美】本贾尼▪斯特劳斯特鲁普 (作者)  符隆美 (责任编辑)

  • 书  号:9787121472503
  • 出版日期:2024-02-01
  • 页  数:296
  • 开  本:16(240*190)
  • 出版状态:上市销售
  • 维护人:博文小编
一共19章,以C++20为标准,讲述了最新的现代C++所提供的编程特性。
有其他语言编程经验的读者可以从本书中快速了解C++所具备的功能,从而获得对现代C++的更全面认知,以便更好地了解现代C++语言已经发展到的程度。资深程序员可以从本书作者的整体行文风格中感受到他在设计C++特性时的一些考量及侧重点,了解C++这门语言在历史上曾经历过的变迁,以及一部分特性为什么会是今天这个样子。
《C++之旅(第3版)(英文版)》适合的读者:有其他语言编程经验,想要了解C++语言的读者;有传统C++编程经验,想要了解现代C++语言特性的读者;有较丰富编程经验且想了解C++之父在C++设计过程中的一些设计细节与思路的读者。
C++之父扛鼎之作、全面接纳C++20/23新版、带领卓越程序员参透设计哲学照见语言未来
前言
在你进行指示时,简短些!
——西塞罗

现代C++给人感觉像一种新的语言。我是说,相比C++98或C++11的时代,现在我能够更清晰、更简单、更直接地表达我的想法。不但如此,现代C++生成的程序也更容易被编译器检查,而且运行得更快。
本书展示了C++20定义的C++的概况,它是当前ISO C++的标准,并且已被主流C++提供商实现。另外,本书还提到了一些目前已使用的库组件,但它们还没被纳入C++23标准的计划。
就像其他的现代编程语言一样,C++也很“大”,因为它需要大量的库来提高自身的效率。这本薄薄的书旨在让有经验的程序员了解现代C++是由什么构成的,它涵盖了主要的语言特性和主要的标准库组件。本书可以在一两天内读完,但要写出好的C++代码,显然需要比读本书多得多的学习时间。然而本书的目标不是让你精通语言,而是提供概述与关键示例来帮助你着手学习。
你最好已经有一些编程经验。如果不是这样,请考虑先阅读相关的资料再继续阅读本书,推荐的资料有《C++程序设计原理与实践》(第2版)[Stroustrup, 2014]。即使你以前编写过程序,使用的语言及写过的程序与这里介绍的C++风格也可能存在非常大的区别。
想象一下,在哥本哈根或者纽约等城市观光旅游。在短短几小时内,你快速地浏览了当地主要景点,聆听了一些背景故事,并获得了一些下一步该做什么的建议。但你并不能在这样简短的旅程中完全理解这座城市,也不能完全理解所见所闻,有些故事听起来可能很奇特,甚至不可思议。你也不知道如何驾驭管理城市生活的规则,不管是正式的还是非正式的。要想真正理解一座城市,你必须在这个城市住上几年。然而,如果足够幸运的话,你可能会了解一些概况,对这个城市的特殊之处形成概念,并且对其中的一部分产生兴趣。在这次旅行结束之时,真正的探索才刚刚开始。
《C++之旅》介绍了C++语言的主要特性,它们都支持面向对象和泛型编程之类的编程风格。不要指望本书会像参考手册那样,逐个特性地详细介绍语言的全貌。在这本最经典的教科书中,我试图在使用一个特性之前对它做出解释的,但其实很难完全做到这样,因为并不是每个人都严格按章节顺序阅读。我认为本书的读者在技术上已经非常成熟。因此,读者不妨对交叉引用善加利用。
同样,《C++之旅》对标准库的介绍以示例的形式点到为止,不会详尽描述所有细节。读者应根据需要搜索额外的资料来获取技术支持。C++生态系统涵盖的范围远超ISO标准提供的配套工具(例如,库、构建系统、分析工具和开发环境),读者可在网上获得海量(但良莠不齐)的资料。大多数读者可以从CppCon和Meeting C++等会议中发现有用的教程和简要介绍的视频。如果读者想要了解有关语言的技术细节和 ISO C++标准提供的库,我推荐Cppreference网站。例如,当遇到一个标准库函数或类时,很容易就能在该网站查到它的定义,而且通过查阅它的文档,可以找到许多相关联的工具。
《C++之旅》呈现出来的C++是一个集成的整体,而不是整齐地堆叠在一起的层状蛋糕。因此,具体的语言特性究竟是来自C、C++98,还是来自更高版本的ISO标准,我极少做出标注。此类信息可在第19章中找到。我专注于基础知识并尽量保证内容简明扼要,但我并没有完全抵制住过度呈现新特性的诱惑,模块(3.2.2节)、概念(8.2节)和协程(18.6节)这三节就是“例证”。我对最新进展的稍许偏爱,似乎也正好满足许多已经了解某些旧版本C++知识的读者的好奇心。
编程语言参考手册或标准只是简单地说明了可以做什么,但程序员通常更感兴趣的是学习如何更好地使用该语言。鉴于此,本书所涵盖的主题是精心挑选的,在文字内容上也有所体现,尤其是在建议性章节。关于现代C++如此优秀的原因,可以在C++ Core Guidelines [Stroustrup, 2015]中找到更多观点。如果想进一步探索本书提出的理念,可以将C++ Core Guidelines视为一个很好的参考来源。你可能会注意到,C++ Core Guidelines 和本书在建议的提法及建议的编号上有着惊人的相似之处,其原因之一是,《C++之旅》的第1版正是C++ Core Guidelines初版内容的主要来源。
鸣谢
感谢所有帮助完成和更正《C++之旅》早期版本的人,特别是在哥伦比亚大学参加我的“Design Using C++”课程的学生。感谢摩根士丹利给我时间编写本书。感谢Chuck Allison、Guy Davidson、Stephen Dewhurst、Kate Gregory、Danny Kalev、Gor Nishanov和J.C. van Winkel审阅本书,并提出了许多改进建议。
我使用troff完成本书的排版,并使用了Brain Kernighan原创的宏。

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

目录

1 基础 17
1.1 引言 17
1.2 程序 18
1.2.1 Hello, World! 18
1.3 函数 20
1.4 类型、变量与运算 21
1.4.1 算术运算 23
1.4.2 初始化 24
1.5 作用域和生命周期 25
1.6 常量 26
1.7 指针、数组和引用 27
1.7.1 空指针 29
1.8 检验 30
1.9 映射到硬件 32
1.9.1 赋值 33
1.9.2 初始化 34
1.10 建议 35
2 用户自定义类型 37
2.1 引言 37
2.2 结构 38
2.3 类 39
2.4 枚举 41
2.5 联合 43
2.6 建议 44
3 模块化 45
3.1 引言 45
3.2 分离编译 46
3.2.1 头文件 47
3.2.2 模块 49
3.3 命名空间 51
3.4 函数参数与返回值 53
3.4.1 参数传递 54
3.4.2 返回值 55
3.4.3 返回类型推导 56
3.4.4 返回类型后置 56
3.4.5 结构化绑定 57
3.5 建议 58
4 错误处理 59
4.1 引言 59
4.2 异常 60
4.3 约束条件 61
4.4 错误处理的其他替代方式 63
4.5 断言 64
4.5.1 assert() 65
4.5.2 Static断言 66
4.5.3 noexcept 66
4.6 建议 67
5 类 69
5.1 引言 69
5.1.1 类的概述 70
5.2 具体类型 70
5.2.1 一种算术类型 71
5.2.2 容器 73
5.2.3 容器的初始化 74
5.3 抽象类型 76
5.4 虚函数 78
5.5 类层次结构 79
5.5.1 类层次结构的益处 81
5.5.2 类层次结构导航 83
5.5.3 避免资源泄漏 83
5.6 建议 85
6 基本操作 87
6.1 引言 87
6.1.1 基本操作 87
6.1.2 转换 89
6.1.3 成员初始值设定项 90
6.2 拷贝和移动 90
6.2.1 拷贝容器 91
6.2.2 移动容器 92
6.3 资源管理 94
6.4 操作符重载 96
6.5 常规操作 97
6.5.1 比较(关系操作符) 97
6.5.2 容器操作 99
6.5.3 迭代器及智能指针 100
6.5.4 输入与输出操作 100
6.5.5 swap() 100
6.5.6 hash<> 100
6.6 用户自定义字面量 100
6.7 建议 101
7 模板 103
7.1 引言 103
7.2 参数化类型 104
7.2.1 受限模板参数 105
7.2.2 模板值参数 106
7.2.3 模板参数推导 107
7.3 参数化操作 109
7.3.1 模板函数 109
7.3.2 函数对象 110
7.3.3 匿名函数表达式 111
7.4 模板机制 115
7.4.1 模板变量 115
7.4.2 别名 116
7.4.3 编译时if 117
7.5 建议 118
8 概念和泛型编程 119
8.1 引言 119
8.2 概念 120
8.2.1 概念的运用 120
8.2.2 基于概念的重载 122
8.2.3 有效代码 122
8.2.4 定义概念 123
8.2.5 概念与auto 126
8.2.6 类型与概念 127
8.3 泛型编程 128
8.3.1 概念的使用 128
8.3.2 使用模板实现抽象 128
8.4 可变参数模板 130
8.4.1 折叠表达式 131
8.4.2 完美转发参数 132
8.5 模板编译模型 133
8.6 建议 133
9 标准库 135
9.1 引言 135
9.2 标准库组件 136
9.3 标准库的组织 137
9.3.1 命名空间 137
9.3.2 ranges命名空间 138
9.3.3 模块 139
9.3.4 头文件 139
9.4 建议 140
10 字符串和正则表达式 141
10.1 引言 141
10.2 字符串 141
10.2.1 string的实现 143
10.3 字符串视图 144
10.4 正则表达式 146
10.4.1 搜索 146
10.4.2 正则表达式的符号表示 147
10.4.3 迭代器 151
10.5 建议 152
11 输入和输出 153
11.1 引言 153
11.2 输出 154
11.3 输入 155
11.4 I/O状态 157
11.5 用户自定义类型的I/O 157
11.6 输出格式化 159
11.6.1 流式格式化 159
11.6.2 printf()风格的格式化 160
11.7 流 162
11.7.1 标准流 163
11.7.2 文件流 163
11.7.3 字符串流 163
11.7.4 内存流 164
11.7.5 同步流 165
11.8 C风格的I/O 165
11.9 文件系统 166
11.9.1 路径 166
11.9.2 文件和目录 169
11.10 建议 170
12章 容器 173
12.1 引言 173
12.2 vector 174
12.2.1 元素 176
12.2.2 范围检查 177
12.3 list 178
12.4 forward_list 180
12.5 map 180
12.6 unordered_map 181
12.7 分配器 182
12.8 容器概述 184
12.9 建议 186
13 算法 189
13.1 引言 189
13.2 使用迭代器 191
13.3 迭代器类型 194
13.3.1 流迭代器 195
13.4 使用谓词 197
13.5 标准库算法概览 197
13.6 并行算法 199
13.7 建议 199
14 范围 201
14.1 引言 201
14.2 视图 202
14.3 生成器 204
14.4 管道 204
14.5 概念概述 206
14.5.1 类型概念 206
14.5.2 迭代器概念 208
14.5.3 范围概念 209
14.6 建议 210


15 指针和容器 211
15.1 引言 211
15.2 指针类型 212
15.2.1 unique_ptr及shared_ptr 213
15.2.2 span 216
15.3 容器 217
15.3.1 array 218
15.3.2 bitset 220
15.3.3 pair 221
15.3.4 tuple 223
15.4 可变类型容器 224
15.4.1 variant 225
15.4.2 optional 226
15.4.3 any 227
15.5 建议 228
16 实用工具 229
16.1 引言 229
16.2 时间 230
16.2.1 时钟 230
16.2.2 日历 230
16.2.3 时区 231
16.3 函数适配 232
16.3.1 匿名函数作为适配器 232
16.3.2 mem_fn() 233
16.3.3 function 233
16.4 类型函数 233
16.4.1 类型谓词 234
16.4.2 条件属性 236
16.4.3 类型生成器 237
16.4.4 关联类型 238
16.5 source_location 238
16.6 move()和forward() 239
16.7 位操作 240
16.8 退出程序 241
16.9 建议 241
17 数值计算 243
17.1 引言 243
17.2 数学函数 244
17.3 数值计算算法 245
17.3.1 并行数值算法 245
17.4 复数 246
17.5 随机数 247
17.6 向量算术 249
17.7 数值界限 250
17.8 类型别名 250
17.9 数学常数 250
17.10 建议 251
18 并发 253
18.1 引言 253
18.2 任务和thread 254
18.2.1 传递参数 255
18.2.2 返回结果 256
18.3 共享数据 257
18.3.1 mutex和锁 257
18.3.2 原子量 259
18.4 等待事件 259
18.5 任务间通信 261
18.5.1 future和promise 261
18.5.2 packaged_task 263
18.5.3 async() 263
18.5.4 停止thread 264
18.6 协程 266
18.6.1 协作式多任务 267
18.7 建议 269
19 历史和兼容性 271
19.1 历史 271
19.1.1 大事年表 272
19.1.2 早期的C++ 273
19.1.3 ISO C++标准 276
19.1.4 标准与编程风格 277
19.1.5 C++的使用 278
19.1.6 C++模型 278
19.2 C++特性演化 279
19.2.1 C++11语言特性 279
19.2.2 C++14语言特性 280
19.2.3 C++17语言特性 280
19.2.4 C++20语言特性 281
19.2.5 C++11标准库组件 281
19.2.6 C++14标准库组件 282
19.2.7 C++17标准库组件 282
19.2.8 C++20标准库组件 282
19.2.9 移除或弃用的特性 283
19.3 C/C++兼容性 284
19.3.1 C与C++是兄弟 284
19.3.2 兼容性问题 285
19.4 参考文献 287
19.5 建议 290
附录A std模块 293

读者评论