内容简介

在这本中,作者把C++完整参考手册中的综述内容摘取出来,并且进行必要的扩充和提升,目的是让有经验的程序员在很短时间之内就能清晰地了解到是哪些元素构成了现代的C++语言。《C++语言导学(英文版·第2版)》虽薄,结构却清晰完整,作者在书中介绍了C++语言的绝大多数特性以及*重要的一些标准库组件。尤其难能可贵的是,虽然受篇幅所限无法对每个知识点展开深入讲解,但依然能够帮助程序员了解语言的全貌,并给出一些关键示例,便于他们更好地学习和使用C++语言。

目录

第1章 基础知识1
1.1 引言1
1.2 程序2
1.3 函数4
1.4 类型、变量和算术运算5
1.5 作用域和生命周期9
1.6 常量9
1.7 指针、数组和引用11
1.8 测试14
1.9 映射到硬件16
1.10 建议18
第2章 用户自定义类型21
2.1 引言21
2.2 结构22
2.3 类23
2.4 联合25
2.5 枚举26
2.6 建议27
第3章 模块化29
3.1 引言29
3.2 分别编译30
3.3 模块(C++20)32
3.4 名字空间34
3.5 错误处理35
3.6 函数参数和返回值36
3.7 建议46
第4章 类47
4.1 引言47
4.2 具体类型48
4.3 抽象类型54
4.4 虚函数…56
4.5 类层次…57
4.6 建议63
第5章 基本操作65
5.1 引言65
5.2 拷贝和移动68
5.3 资源管理72
5.4 常规操作74
5.5 建议77
第6章 模板79
6.1 引言79
6.2 参数化类型79
6.3 参数化操作84
6.4模板机制89
6.5建议92
第7章 概念与泛型编程93
7.1 引言93
7.2 概念94
7.3 泛型编程98
7.4 可变参数模板100
7.5 模板编译模式104
7.6 建议104
第8章 标准库概览107
8.1 介绍107
8.2 标准库组件108
8.3 标准库头文件和名字空间109
8.4 建议110
第9章 字符串和正则表达式111
9.1 介绍111
9.2 字符串111
9.3 字符串视图114
9.4 正则表达式116
9.5建议122
第10章 输入输出123
10.1 介绍123
10.2 输出123
10.3 输入125
10.4 I/O状态127
10.5 用户自定义类型的I/O128
10.6 格式化129
10.7 文件流130
10.8 字符串流130
10.9 C风格I/O131
10.10 文件系统132
10.11 建议136
第11章 容器137
11.1 介绍137
11.2 vector138
11.3 list142
11.4 map144
11.5 unordered_map144
11.6 容器概览146
11.7 建议148
第12章 算法149
12.1 介绍149
12.2 使用迭代器150
12.3 迭代器类型153
12.4 流迭代器154
12.5 谓词155
12.6 算法概览156
12.7 概念(C++20)157
12.8 容器算法160
12.9 并行算法161
12.10 建议161
第13章 实用工具163
13.1 引言163
13.2 资源管理164
13.3 范围检查:span168
13.4 特殊容器170
13.5 替代选择174
13.6 分配器178
13.7 时间179
13.8 函数适配180
13.9 类型函数181
13.10 建议185
第14章 数值187
14.1 引言187
14.2 数学函数188
14.3 数值算法189
14.4 复数190
14.5 随机数191
14.6 向量算术192
14.7 数值限制193
14.8 建议193
第15章 并发195
15.1 引言195
15.2 任务和thread196
15.3 传递参数197
15.4 返回结果198
15.5 共享数据199
15.6 等待事件200
15.7 任务通信202
15.8 建议205
第16章 历史和兼容性207
16.1 历史207
16.2 C++特性演化214
16.3 C/C++兼容性218
16.4 参考文献222
16.5 建议225


Contents
ContentsPreface
1TheBasics1
1.1Introduction...........................................................1
1.2Programs...............................................................2
1.3Functions...............................................................4
1.4Types,Variables,andArithmetic..........................5
1.5ScopeandLifetime...............................................9
1.6Constants.........................................9
1.7Pointers,Arrays,andReferences..........................11
1.8Tests................................................14
1.9MappingtoHardware...........................................16
1.10Advice.............................................18
2User-Definedypes21
2.1Introduction.....................................21
2.2Structures........................................22
2.3Classes............................................23
2.4Unions...................................................................25
2.5Enumerations........................................................26
2.6Advice...................................................................27
3Modularity29
3.1Introduction...........................................................29
3.2SeparateCompilation............................................30
3.3Modules(C++20)..................................................32
3.4Namespaces...........................................................34
3.5ErrorHandling......................................................35
3.6FunctionArgumentsandReturnValues.....................................36
3.7Advice...................................................................46
4Classes47
4.1Introduction....................................................

前言/序言

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

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

BjarneStroustrup
曼哈顿,纽约

其他推荐