|
| 1 | +# 高速上手 C++ 11/14 |
| 2 | + |
| 3 | +## 引言 |
| 4 | + |
| 5 | +C++ 算是一个用户群体比较大的语言了,从 C++98 到 C++11 经历了长达十年多之久的积累,C++14 则是作为对 C++11 的重要补充和优化,所有这些新标准中扩充的特性,给 C++ 这门语言注入了新的活力。 |
| 6 | +那些还在坚持使用**传统 C++** (本教程把 C++98 及其之前的 C++ 特性均称之为传统 C++)而未接触过 C++11/14 的 C++ 程序员在见到诸如 Lambda 表达式这类全新特性时,甚至会流露出『学的不是同一门语言』的惊叹之情。 |
| 7 | + |
| 8 | +**C++1x** (本教程中指 C++11/14, 甚至 C++17) 为传统 C++ 注入的大量特性使得整个 C++ 变得更加像一门现代化的语言。C++1x 不仅仅增强了 C++ 语言自身的可用性,`auto` 关键字语义的修改使得我们更加有信心来操控极度复杂的模板类型。同时还对语言运行期进行了大量的强化,Lambda 表达式的出现让 C++ 具有了『匿名函数』的『闭包』特性,而这一特性几乎在现代的编程语言(诸如 Python/Swift/... )中已经司空见惯,右值引用的出现解决了 C++ 长期以来被人诟病的临时对象效率问题等等。 |
| 9 | + |
| 10 | +C++1x 为自身的标准库增加了非常多的工具和方法,诸如在语言层面上提供了 `std::thread` 支持了并发编程,在不同平台上不再依赖于系统底层的 API,实现了语言层面的跨平台支持;`std::regex`提供了完整的正则表达式支持等等。C++98 已经被实践证明了是一种非常成功的『范型』,而 C++1x 的出现,则进一步推动这种范型,让 C++ 成为系统程序设计和库开发更好的语言。 |
| 11 | + |
| 12 | +## 目标读者 |
| 13 | + |
| 14 | +1. 本教程假定读者已经熟悉了传统 C++ ,至少在阅读传统 C++ 代码上不具备任何困难。换句话说,那些长期使用传统 C++进行编码的人、渴望在短时间内迅速了解 **Modern C++** 特性的人非常适合阅读本书; |
| 15 | +2. 本教程一定程度上介绍了一些 C++1x 的**黑魔法**,但这些魔法毕竟有限,不适合希望进阶学习 C++1x 的读者,本教程的定位系**C++1x 的快速上手**。当然,希望进阶学习的读者可以使用本书来回顾并检验自己对 **Modern C++** 的熟悉度。 |
| 16 | + |
| 17 | +## 本书目的 |
| 18 | + |
| 19 | +本教程号称高速上手教程,从内容上对 C++11/14/17 (与惯例不同,本书决定统一称为 C++1x)的相关特性做了一个相对全面的介绍,读者可以自行根据下面的目录选取感兴趣的内容进行学习,快速熟悉需要了解的内容,这从某种意义上来说,也算是高速上手了。 |
| 20 | + |
| 21 | +这些特性并不需要全部掌握,只需针对特定的应用场景,学习、查阅最适合自己的新特性即可。 |
| 22 | + |
| 23 | +值得一提的是,**本教程在介绍这些特性的过程中,尽可能简单明了的介绍了这些特性产生的历史背景和技术需求,这为理解这些特性、运用这些特性提供了很大的帮助。** |
| 24 | + |
| 25 | +目录 |
| 26 | +-- |
| 27 | + |
| 28 | +> 正在向支持 C++17 的内容过度 |
| 29 | +
|
| 30 | +- **第一章 C++11/14 简介** |
| 31 | + + 概述 |
| 32 | + + 被弃用的特性 |
| 33 | + + 与 C 的兼容性 |
| 34 | +- **第二章 语言可用性的强化** |
| 35 | + + `nullptr` 与 `constexpr` |
| 36 | + + 类型推导 |
| 37 | + + `auto` |
| 38 | + + `decltype` |
| 39 | + + 尾返回类型、`auto` 与 `decltype` 配合 |
| 40 | + |
| 41 | + <!--+ decltype(auto) (C++14)--> |
| 42 | + |
| 43 | + + 区间迭代 |
| 44 | + + 基于范围的 for 循环 |
| 45 | + + 初始化列表 |
| 46 | + + `std::initializer_list` |
| 47 | + + 统一初始化语法 |
| 48 | + + 模板增强 |
| 49 | + + 外部模板 |
| 50 | + + 尖括号 `>` |
| 51 | + + 类型别名模板 |
| 52 | + + 变长参数模板 |
| 53 | + + 面向对象增强 |
| 54 | + + 委托构造 |
| 55 | + + 继承构造 |
| 56 | + + 显式虚函数重载 |
| 57 | + + `override` |
| 58 | + + `final` |
| 59 | + + 显式禁用默认函数 |
| 60 | + + 强类型枚举 |
| 61 | +- **第三章 语言运行期的强化** |
| 62 | + + lambda 表达式 |
| 63 | + + lambda 表达式基础 |
| 64 | + + 值捕获 |
| 65 | + + 引用捕获 |
| 66 | + + 隐式捕获 |
| 67 | + + 表达式捕获 |
| 68 | + + 泛型 lambda |
| 69 | + + 函数对象包装器 |
| 70 | + + std::function |
| 71 | + + std::bind/std::placeholder |
| 72 | + + 右值引用 |
| 73 | + + 左值、右值的纯右值、将亡值、右值 |
| 74 | + + 右值引用和左值引用 |
| 75 | + + 移动语义 |
| 76 | + + 完美转发 |
| 77 | +- **第四章 对标准库的扩充: 新增容器** |
| 78 | + + `std::array` |
| 79 | + + `std::forward_list` |
| 80 | + + `std::unordered_set` |
| 81 | + + `std::unordered_map` |
| 82 | + + `std::tuple` |
| 83 | + + 基本操作 |
| 84 | + + 运行期索引 |
| 85 | + + 合并与迭代 |
| 86 | +- **第五章 对标准库的扩充: 智能指针和引用计数** |
| 87 | + + RAII 与引用计数 |
| 88 | + + `std::shared_ptr` |
| 89 | + + `std::unique_ptr` |
| 90 | + + `std::weak_ptr` |
| 91 | +- **第六章 对标准库的扩充: 正则表达式库** |
| 92 | + + 正则表达式简介 |
| 93 | + + 普通字符 |
| 94 | + + 特殊字符 |
| 95 | + + 限定符 |
| 96 | + + `std::regex` 及其相关 |
| 97 | + + `std::regex` |
| 98 | + + `std::regex_match` |
| 99 | + + `std::match_results` |
| 100 | +- **第七章 对标准库的扩充: 语言级线程支持** |
| 101 | + + `std::thread` |
| 102 | + + `std::mutex` |
| 103 | + + `std::unique_lock` |
| 104 | + + `std::future` |
| 105 | + + `std::packaged_task` |
| 106 | + + `std::condition_variable` |
| 107 | +- **第八章 其他杂项** |
| 108 | + + 新类型 |
| 109 | + + `long long int` |
| 110 | + + `noexcept` 的修饰和操作 |
| 111 | + + 字面量 |
| 112 | + + 原始字符串字面量 |
| 113 | + + 自定义字面量 |
| 114 | +- **第九章 扩展主题: C++17 简介** |
| 115 | + + 主要入选特性 |
| 116 | + + 非类型模板参数的 `auto` |
| 117 | + + `std::variant<>` |
| 118 | + + 结构化绑定(Structured bindings) |
| 119 | + + 变量声明的强化 |
| 120 | + + 未入选特性 |
| 121 | + + Concepts |
| 122 | + |
| 123 | + |
| 124 | + |
| 125 | +## 许可 |
| 126 | + |
| 127 | +<a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png" /></a> |
| 128 | + |
| 129 | +本教程由[欧长坤](https://github.com/changkun)撰写,采用[知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/)许可。项目中代码使用 MIT 协议开源,参见[许可](../LICENSE)。 |
0 commit comments