mirror of
https://github.com/changkun/modern-cpp-tutorial.git
synced 2025-12-17 20:54:39 +03:00
132 lines
6.8 KiB
Markdown
132 lines
6.8 KiB
Markdown
# 高速上手现代 C++ 11/14/17
|
||
|
||
> 内容修订中
|
||
|
||
## 引言
|
||
|
||
C++ 是一个用户群体相当大的语言。从 C++98 的出现到 C++11 的正式定稿经历了长达十年多之久的积累。C++14/17 则是作为对 C++11 的重要补充和优化,所有这些新标准中扩充的特性,给 C++ 这门语言注入了新的活力。
|
||
那些还在坚持使用**传统 C++**(本教程把 C++98 及其之前的 C++ 特性均称之为传统 C++)而未接触过 C++11/14/17 的 C++ 程序员在见到诸如 Lambda 表达式这类全新特性时,甚至会流露出『学的不是同一门语言』的惊叹之情。
|
||
|
||
**C++1x** (或**现代 C++**,本教程中均指 C++11/14/17) 为传统 C++ 注入的大量特性使得整个 C++ 变得更加像一门现代化的语言。C++1x 不仅仅增强了 C++ 语言自身的可用性,`auto` 关键字语义的修改使得我们更加有信心来操控极度复杂的模板类型。同时还对语言运行期进行了大量的强化,Lambda 表达式的出现让 C++ 具有了『匿名函数』的『闭包』特性,而这一特性几乎在现代的编程语言(诸如 Python/Swift/... )中已经司空见惯,右值引用的出现解决了 C++ 长期以来被人诟病的临时对象效率问题等等。
|
||
|
||
C++17 则是近三年依赖 C++ 社区一致推进的方向,也指出了**现代C++**编程的一个重要发展方向。尽管它的出现并不如 C++11 的分量之重,但它包含了大量小而美的语言与特性(例如结构化绑定),这些特性的出现再一次修正了我们在 C++ 中的编程范式。
|
||
|
||
现代 C++ 还为自身的标准库增加了非常多的工具和方法,诸如在语言自身标准的层面上制定了 `std::thread`,从而支持了并发编程,在不同平台上不再依赖于系统底层的 API,实现了语言层面的跨平台支持;`std::regex` 提供了完整的正则表达式支持等等。C++98 已经被实践证明了是一种非常成功的『范型』,而 C++1x 的出现,则进一步推动这种范型,让 C++ 成为系统程序设计和库开发更好的语言。
|
||
|
||
总而言之,我们作为 C++ 的拥护与实践者,始终保持接纳新事物的开放心态,才能更快的推进 C++ 的发展,使得这门古老而又新颖的语言更加充满活力。
|
||
|
||
## 目标读者
|
||
|
||
1. 本教程假定读者已经熟悉了传统 C++ ,至少在阅读传统 C++ 代码上不具备任何困难。换句话说,那些长期使用传统 C++进行编码的人、渴望在短时间内迅速了解**现代 C++** 特性的人非常适合阅读本书;
|
||
2. 本教程一定程度上介绍了一些现代 C++ 的**黑魔法**,但这些魔法毕竟有限,不适合希望进阶学习现代 C++ 的读者,本教程的定位系**现代 C++ 的快速上手**。当然,希望进阶学习的读者可以使用本书来回顾并检验自己对 **现代 C++** 的熟悉度。
|
||
|
||
## 本书目的
|
||
|
||
本教程号称高速上手教程,从内容上对二十一世纪二十年代之前产生 C++ 的相关特性做了非常相对全面的介绍,读者可以自行根据下面的目录选取感兴趣的内容进行学习,快速熟悉需要了解的内容。这些特性并不需要全部掌握,只需针对自己的使用需求和特定的应用场景,学习、查阅最适合自己的新特性即可。
|
||
|
||
同时,本教程在介绍这些特性的过程中,尽可能简单明了的介绍了这些特性产生的历史背景和技术需求,这为理解这些特性、运用这些特性提供了很大的帮助。
|
||
|
||
此外,本教程希望读者在阅读本书后,能够努力在新项目中直接使用 C++17,并努力将旧项目逐步迁移到 C++17。也算是笔者为推进现代 C++ 的普及贡献了一些绵薄之力。
|
||
|
||
## 目录
|
||
|
||
> 目录正在向支持 C++17 的内容过度
|
||
|
||
- **第一章 C++11/14/17 简介**
|
||
+ 概述
|
||
+ 被弃用的特性
|
||
+ 与 C 的兼容性
|
||
- **第二章 语言可用性的强化**
|
||
+ `nullptr` 与 `constexpr`
|
||
+ 类型推导
|
||
+ `auto`
|
||
+ `decltype`
|
||
+ 尾返回类型、`auto` 与 `decltype` 配合
|
||
|
||
<!--+ decltype(auto) (C++14)-->
|
||
|
||
+ 区间迭代
|
||
+ 基于范围的 for 循环
|
||
+ 初始化列表
|
||
+ `std::initializer_list`
|
||
+ 统一初始化语法
|
||
+ 模板增强
|
||
+ 外部模板
|
||
+ 尖括号 `>`
|
||
+ 类型别名模板
|
||
+ 变长参数模板
|
||
+ 面向对象增强
|
||
+ 委托构造
|
||
+ 继承构造
|
||
+ 显式虚函数重载
|
||
+ `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`
|
||
+ `std::variant<>`
|
||
+ 结构化绑定(Structured bindings)
|
||
+ 变量声明的强化
|
||
+ 未入选特性
|
||
+ Concepts
|
||
|
||
## 许可
|
||
|
||
<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>
|
||
|
||
本教程由[欧长坤](https://github.com/changkun)撰写,采用[知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/)许可。项目中代码使用 MIT 协议开源,参见[许可](../LICENSE)。 |