# 引言

> 请读者注意！ 请读者注意！ 请读者注意！
>
> 由于 GitBook 产品体验与维护的滞后性，本教程现已转移至 GitHub 进行维护，此页面仅用作暂存，**请以 GitHub 仓库的内容为准。**
>
> 本书已更新至 C++ 20
>
> **浏览最新内容：**<https://github.com/changkun/modern-cpp-tutorial>

## 引言

C++ 算是一个用户群体比较大的语言了，从 C++98 到 C++11 经历了长达十年多之久的积累，C++14 则是作为对 C++11 的重要补充和优化，所有这些新标准中扩充的特性，给 C++ 这门语言注入了新的活力。

那些还在坚持使用**传统 C++** （本教程把 C++98 及其之前的 C++ 特性均称之为传统 C++）而未接触过 C++11/14 的 C++ 程序员在见到诸如 Lambda 表达式这类全新特性时，甚至会流露出『学的不是同一门语言』的惊叹之情。

**C++1x** (本教程中指 C++11/14, 甚至 C++17) 为传统 C++ 注入的大量特性使得整个 C++ 变得更加像一门现代化的语言。C++1x 不仅仅增强了 C++ 语言自身的可用性，`auto` 关键字语义的修改使得我们更加有信心来操控极度复杂的模板类型。同时还对语言运行期进行了大量的强化，Lambda 表达式的出现让 C++ 具有了『匿名函数』的『闭包』特性，而这一特性几乎在现代的编程语言（诸如 Python/Swift/... ）中已经司空见惯，右值引用的出现解决了 C++ 长期以来被人诟病的临时对象效率问题等等。

C++1x 为自身的标准库增加了非常多的工具和方法，诸如在语言层面上提供了 `std::thread` 支持了并发编程，在不同平台上不再依赖于系统底层的 API，实现了语言层面的跨平台支持；`std::regex`提供了完整的正则表达式支持等等。C++98 已经被实践证明了是一种非常成功的『范型』，而 C++1x 的出现，则进一步推动这种范型，让 C++ 成为系统程序设计和库开发更好的语言。

## 目标读者

1. 本教程假定读者已经熟悉了传统 C++ ，至少在阅读传统 C++ 代码上不具备任何困难。换句话说，那些长期使用传统 C++进行编码的人、渴望在短时间内迅速了解 `Modern C++` 特性的人非常适合阅读本书；
2. 本教程一定程度上介绍了一些 C++1x 的**黑魔法**，但这些魔法毕竟有限，不适合希望进阶学习 C++1x 的读者，本教程的定位系**C++1x 的快速上手**。当然，希望进阶学习的读者可以使用本书来回顾并检验自己对 `Modern C++` 的熟悉度。

## 本书目的

本教程虽号称高速上手教程，但实际上对 C++11/14 的相关特性做了一个较为全面的介绍，读者可以自行根据下面的目录选取感兴趣的内容进行学习，快速熟悉需要了解的内容，这从某种意义上来说，也算是高速上手了。

这些特性并不需要全部掌握，只需针对特定的应用场景，学习、查阅最适合自己的新特性即可。

值得一提的是，**本教程在介绍这些特性的过程中，尽可能简单明了的介绍了这些特性产生的历史背景和技术需求，这为理解这些特性、运用这些特性提供了很大的帮助。**

## 内容一览

* **第一章 C++11/14 简介**
  * 概述
  * 被弃用的特性
  * 与 C 的兼容性
* **第二章 语言可用性的强化**
  * `nullptr` 与 `constexpr`
  * 类型推导
    * `auto`
    * `decltype`
    * 尾返回类型、`auto` 与 `decltype` 配合
  * 区间迭代
    * 基于范围的 for 循环
  * 初始化列表
    * `std::initializer_list`
    * 统一初始化语法
  * 模板增强
    * 外部模板
    * 尖括号 `>`&#x20;
    * 类型别名模板
    * 变长参数模板
  * 面向对象增强
    * 委托构造
    * 继承构造
    * 显式虚函数重载
      * `override`
      * `final`
    * 显式禁用默认函数
  * 强类型枚举
* **第三章 语言运行期的强化**
  * lambda 表达式
    * lambda 表达式基础
      * 值捕获
      * 引用捕获
      * 隐式捕获
      * 表达式捕获
    * 泛型 lambda
  * 函数对象包装器
    * std::function
    * std::bind/std::placeholder
  * 右值引用
    * 左值、右值的纯右值、将亡值、右值
    * 右值引用和左值引用
    * 移动语义
    * 完美转发
* **第四章 对标准库的扩充: 新增容器**
  * `std::array`
  * `std::forward_list`
  * `std::unordered_set`
  * `std::unordered_map`
  * `std::tuple`
    * 基本操作
    * 运行期索引
    * 合并与迭代
* **第五章 对标准库的扩充: 智能指针和引用计数**
  * RAII 与引用计数
  * `std::shared_ptr`
  * `std::unique_ptr`
  * `std::weak_ptr`
* **第六章 对标准库的扩充: 正则表达式库**
  * 正则表达式简介
    * 普通字符
    * 特殊字符
    * 限定符
  * `std::regex` 及其相关
    * `std::regex`
    * `std::regex_match`
    * `std::match_results`
* **第七章 对标准库的扩充: 语言级线程支持**
  * `std::thread`
  * `std::mutex`
  * `std::unique_lock`
  * `std::future`
  * `std::packaged_task`
  * `std::condition_variable`
* **第八章 其他杂项**
  * 新类型
    * `long long int`
  * `noexcept` 的修饰和操作
  * 字面量
    * 原始字符串字面量
    * 自定义字面量
* **第九章 扩展主题: C++17 简介**
  * 主要入选特性
    * 非类型模板参数的 `auto`&#x20;
    * `std::variant<>`
    * 结构化绑定(Structured bindings)
    * 变量声明的强化
  * 未入选特性
    * Concepts

## 赞助

如果你认为本教程对你起到了帮助并希望赞助作者，可以通过下面的二维码给予支持。

|                                                                                                      微信                                                                                                      |                                                                                                      支付宝                                                                                                     |
| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| ![](https://2186347771-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LmAGnx09dXIfYz_ifmq%2F-LmAGozqIXjrzGMm_u-_%2F-LmAGr1ip0_DkiPa033N%2Fwechat.jpg?generation=1565704812895179\&alt=media) | ![](https://2186347771-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LmAGnx09dXIfYz_ifmq%2F-LmAGozqIXjrzGMm_u-_%2F-LmAGr1kCC1LMhH5qx4L%2Falipay.jpg?generation=1565704813445501\&alt=media) |

## 交流

1. 本教程在每节的最下方提供了评论，如果读者发现教程中内容的错误，可以使用评论或者通过发 issue 来指出；
2. 本书依然有很多特性没有参与介绍，例如 `alignas` 内存对齐、无限制联合等，主要是考虑到这些特性的使用频次实在是太低，故没有多做介绍，若对未提及的特性有需求，笔者可以考虑将其加入`第八章`；
3. 笔者是一枚 C++ 新手，所以水平有限，若有任何错误，欢迎指出，让我把这个教程做得更好；

## GitHub

本书中涉及的相关代码可以在 GitHub 上查看：

<https://github.com/changkun/modern-cpp-tutorial>

## 致谢

笔者感谢以下读者指出本书中出现的错误：

[Recolic Keghart](https://www.gitbook.com/@recolic), [sinomiko](https://www.gitbook.com/@sinomiko), [Wang Zhenhua](https://www.gitbook.com/@jackwish), [asm warrior](https://www.gitbook.com/@asmwarrior), [garicc](https://www.gitbook.com/@ihpy), [Wenhan Jiang](https://www.gitbook.com/@jiangwenhan), [liang xiao](https://www.gitbook.com/@liangx8)

## 版权声明

\
本教程系 [欧长坤(欧龙崎)](https://changkun.us/) 为[实验楼](https://www.shiyanlou.com)编写的基础课教程，采用[知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/)进行许可。

教程地址：<https://www.shiyanlou.com/courses/605>
