Preface
前言
C++是一种非常流行且被广泛运用的编程语言,30多年来一直如此。C++专注于性能、效率和灵活性,结合了诸如面向对象、命令式、泛型和函数式编程等范式。C++标准由国际标准化组织(International Organization for Standardization,ISO)制定,在过去的十年里经历了巨大变革。随着C++11的标准化,这门语言进入了新的时代,这被称为现代C++。类型推导、移动语义、lambda表达式、智能指针、统一初始化、可变参数模板和许多其他特性改变了我们用C++编写代码的方式,以至于它几乎看起来像一种新的编程语言。随着2020年C++20标准的发布,这一变化正在进一步推进。新标准包括C++语言的许多新变化,例如模块、概念(concept)和协程,相应的标准库也发生了变化,例如range、文本格式化和日历。
本书将主要介绍C++11、C++14、C++17以及C++20标准。本书按照条目(recipe)[1]的方式编排,每一个条目包含一个特定语言或库特性,或者C++开发人员面临的常见问题及其现代C++典型解决方案。通过130多个条目,你将掌握核心语言特性和标准库,包括字符串、容器、算法、迭代器、流、正则表达式、线程、文件系统、原子操作、实用程序和range。
本书中30多个新的或更新的条目涵盖了C++20的特性,包括模块、概念、协程、range、线程和同步机制、文本格式化、日历和时区、即时函数、三元比较运算符和新的span类。
本书中的所有条目都包含展示某个特性使用方法或某个问题解决方式的代码示例。这些代码示例使用Visual Studio 2019编写,但是也可以使用Clang和GCC进行编译。这些编译器在逐步支持更多的语言特性,所以推荐使用新版本的编译器,以保证书中的示例都可以通过编译。在撰写这篇前言时,新版本为GCC 10.1、Clang 12.0和VC++2019 14.27(Visual Studio 2019 16.7)。尽管这些编译器完全支持C++17,但是对于C++20标准的支持因编译器而异。请参考https://en.cppreference.com/w/cpp/compiler_support来检查编译器对C++20特性的支持情况。
读者对象
本书面向所有的C++开发人员,无论他们的经验水平如何。一般初级或者中级的C++开发人员可以通过本书掌握新特性,并成为经验丰富的现代C++开发者。有经验的C++开发人员可以时不时地通过本书查阅C++11、C++14、C++17和C++20标准的新特性。本书包含130多个简单、中级或高级的条目。然而,它们都要求读者具备一些C++知识,包括函数、类、模板、命名空间以及宏等。因此,如果你不熟悉该语言,建议先看入门书来熟悉一下核心知识,然后再继续阅读本书。
本书内容
第1章介绍现代C++语言的核心特性,包括类型推导、统一初始化、作用域枚举、基于range的for循环、结构化绑定、类模板参数推导等。
第2章讨论数值和字符串之间的相互转换、伪随机数生成、正则表达式以及各种类型的字符串,同时也探讨如何用C++20文本格式化库格式化文本。
第3章深入探讨实现默认函数和删除函数、可变参数模板、lambda表达式和高阶函数。
第4章尝试从各个角度介绍编译过程,例如条件编译、编译时断言、代码生成和用属性提示编译器[2]。
第5章介绍几种标准库容器、算法以及编写自定义随机访问迭代器的方法。
第6章深入讲解chrono库,包括C++20对日历和时区的支持,any、optional、variant和span类型,以及类型特征(type trait)。
第7章解释如何把数据写入文件流,如何从文件流读取数据,以及如何使用I/O操作符来控制文件流,并探索filesystem库。
第8章介绍如何使用线程、互斥量、锁、条件变量、promise、future、原子类型,以及C++20的latch、barrier和semaphore。
第9章主要探讨异常、常量正确性、类型转换、智能指针和移动语义。
第10章涵盖各种有用的设计模式和惯用法,例如pimpl惯用法、非虚接口惯用法和奇异递归模板模式(Curiously Recurring Template Pattern,CRTP)。
第11章介绍3个广泛使用并且可以快速上手的测试框架,即Boost.Test、Goolge Test和Catch2。
第12章介绍C++20重要的新增特性——模块、概念、协程和range。
充分利用本书
虽然我鼓励大家自己尝试录入本书的示例代码,但是本书的示例代码可从https://github.com/PacktPublishing/Modern-Cpp-Cookbook-Second-Edition网站下载。在Windows平台上,需要用VC++2019 14.27编译,在Linux和Mac平台上,则需要用GCC 10.1或者Clang 12.0编译。如果你没有新版本的编译器,或者想尝试其他的编译器,那么可以使用在线编译器。虽然网上有很多平台可供我们使用,但是我推荐https://wandbox.org/网站上的Wandbox,以及https://godbolt.org/网站上的Compiler Explorer。
下载示例代码及彩色图像
本书的示例代码及所有截图和样图,可以从http://www.packtpub.com通过个人账号下载。
本书的代码也托管在GitHub上,网址为https://github.com/PacktPublishing/Modern-CPP-Programming-Cookbook-Second-Edition。本书中使用的屏幕截图或图表还可从https://static.packt-cdn.com/downloads/9781800208988_ColorImages.pdf下载。
本书约定
本书使用了许多文本约定。
CodeInText:表示文本中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、用户输入和Twitter句柄。
代码块约定如下:
当希望读者特别注意某段代码时,相应的代码会高亮显示,就像下面这样:
命令行的输入和输出如下:
代表警告或重要提示。
代表小窍门和技巧。
[1]大约每一节一个条目,每个条目介绍一种核心技巧。——译者注
[2]C++11之后的版本引入了一些属性用于提示编译器,如noreturn、deprecated、nodiscard、likely以及assume等。——译者注