引言

请读者注意! 请读者注意! 请读者注意!

由于 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 的兼容性

  • 第二章 语言可用性的强化

    • nullptrconstexpr

    • 类型推导

      • auto

      • decltype

      • 尾返回类型、autodecltype 配合

    • 区间迭代

      • 基于范围的 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

赞助

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

微信

支付宝

交流

  1. 本教程在每节的最下方提供了评论,如果读者发现教程中内容的错误,可以使用评论或者通过发 issue 来指出;

  2. 本书依然有很多特性没有参与介绍,例如 alignas 内存对齐、无限制联合等,主要是考虑到这些特性的使用频次实在是太低,故没有多做介绍,若对未提及的特性有需求,笔者可以考虑将其加入第八章

  3. 笔者是一枚 C++ 新手,所以水平有限,若有任何错误,欢迎指出,让我把这个教程做得更好;

GitHub

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

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

致谢

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

Recolic Keghart, sinomiko, Wang Zhenhua, asm warrior, garicc, Wenhan Jiang, liang xiao

版权声明

本教程系 欧长坤(欧龙崎)实验楼编写的基础课教程,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

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

Last updated