Skip to content

Latest commit

 

History

History
151 lines (87 loc) · 9.25 KB

File metadata and controls

151 lines (87 loc) · 9.25 KB

零、前言

在这本书里,你将学习高级的 C++ 技术,你可以在你自己的 C++ 项目中使用。这本书教 C++ 使用的是一种食谱风格的方法,每种食谱都有例子和截图,你可以从 GitHub 下载并自己动手。这本书使用 C++ 17 规范来教 C++,并在最后偷偷看了一下 C++ 20 中增加的新特性。在一些食谱中,我们甚至会使用反汇编器来更好地理解 C++ 是如何编译的,以及某些决定对您的应用的影响。到本书结束时,您将掌握 C++ 的高级概念,并能够解决日常问题,这将使您的 C++ 编程更上一层楼。

这本书是给谁的

本书面向熟悉 C++ 并希望获得专家技能,成为精通 C++ 开发人员的中级 C++ 开发人员。假设对语言有很好的理解,包括对汇编的基本理解。

这本书涵盖了什么

第 1 章入门库开发,教你如何开发自己的库,包括一个最少惊喜原则的解释,如何命名一切,如何编写只有头文件的库,以及如何保证别人会继续使用你的库。

第 2 章使用异常进行错误处理,涵盖了 C++ 异常和错误处理的更高级的主题,包括对noexcept说明符和运算符的详细解释,RAII 如何在出现异常时支持资源管理,为什么应该避免从析构函数抛出,以及如何编写自己的异常。

第三章实现移动语义,提供了 C++ 移动语义的详细解释,包括对大五的解释,如何让你的类可移动,如何编写只移动(和不移动)不复制样式的类,如何正确实现一个移动构造函数,为什么const &&没有意义,如何使用引用限定。

第 4 章使用模板进行泛型编程,像专家一样教你如何编写模板函数,包括如何实现自己的 SFINAE,如何执行完美转发,如何使用constexpr-if语句,如何利用带有参数包的元组,如何在编译时循环使用参数包,如何使用类型特征实现同一个函数的不同版本,如何使用template<auto>,以及如何在自己的应用中利用显式类型声明。

第五章并发和同步,教你如何使用std::mutex(和朋友们),什么时候使用原子类型,如何使用mutable关键字处理const类的线程安全,如何编写线程安全类,如何编写线程安全包装器,以及如何编写包含承诺和未来的异步 C++ 语言。

第 6 章优化您的代码以获得性能,涵盖了如何对您的 C++ 进行概要分析和基准测试,如何反汇编您的 C++ 以更好地理解如何优化您的代码,如何定位和删除不需要的内存分配,以及为什么noexcept有助于优化。

第 7 章调试和测试,带您了解如何使用Catch2对 C++ 进行单元测试,如何使用谷歌的 ASAN 和 UBSAN 杀毒软件动态分析您的代码是否存在内存损坏和未定义的行为,以及如何使用 NDEBUG。

第 8 章创建和实现自己的容器,通过创建一个始终排序的std::vector,教你如何编写自己的容器包装器。

第 9 章探索类型擦除,教你关于类型擦除需要知道的一切,包括如何通过继承和使用模板擦除类型,如何实现类型擦除模式,如何实现委托模式。

第 10 章深入了解动态分配,教你动态内存分配方面的进阶话题,包括如何正确使用std::unique_ptrstd::shared_ptr、如何处理循环引用、如何键入强制转换智能指针,以及堆如何在幕后工作,为你的应用提供动态内存。

第 11 章C++ 中的常见模式解释了计算机科学中不同的模式是如何在 c++ 中实现的,包括工厂模式、单例模式、装饰器模式和观察者模式,以及如何实现静态多态来编写自己的静态接口,而不需要虚拟继承。

第 12 章仔细看看类型推导,深入探究了在 C++ 17 中如何进行类型推导,包括autodecltypetemplate如何自动推导它们的类型。本章以如何编写自己的 C++ 17 用户定义推导指南的例子结束。

第 13 章奖励:使用 C++ 20 特性,提供了 C++ 20 新特性的预览,包括概念、模块、范围和协同程序。

充分利用这本书

我们假设您以前写过 C++ 并且已经熟悉了一些现代 C++ 特性。

这本书使用 Ubuntu 来提供例子,你可以在阅读这本书的时候自己编译和运行。我们假设您对 Ubuntu、如何安装它以及如何使用 Linux 终端有一些基本的了解。

我们在一些食谱中使用反汇编器来更好地理解编译器在幕后做什么。虽然您不需要知道如何阅读程序集来理解正在教授的内容,但是对 x86_64 程序集的基本理解将会有所帮助。

下载示例代码文件

你可以从你在www.packt.com的账户下载这本书的示例代码文件。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support并注册将文件直接通过电子邮件发送给您。

您可以按照以下步骤下载代码文件:

  1. 登录或注册www.packt.com
  2. 选择“支持”选项卡。
  3. 点击代码下载。
  4. 在搜索框中输入图书的名称,并按照屏幕指示进行操作。

下载文件后,请确保使用最新版本的解压缩文件夹:

  • 视窗系统的 WinRAR/7-Zip
  • zipeg/izp/un ARX for MAC
  • 适用于 Linux 的 7-Zip/PeaZip

这本书的代码包也托管在 GitHub 上的https://GitHub . com/packt publishing/Advanced-CPP-Programming-cook book。如果代码有更新,它将在现有的 GitHub 存储库中更新。

我们还有来自丰富的图书和视频目录的其他代码包,可在**【https://github.com/PacktPublishing/】**获得。看看他们!

行动中的代码

访问以下链接查看正在运行的代码的视频:https://bit.ly/2tQoZyW

使用的约定

本书通篇使用了许多文本约定。

constexpr:用文本、数字、文件夹名、文件名、文件扩展名、路径名、虚拟网址和用户输入表示码字。这里有一个例子:“使用noexcept说明符来告诉编译器一个函数是否可以抛出 C++ 异常。”

代码块设置如下:

int main(void)
{
    the_answer is;
    return 0;
}

当我们希望将您的注意力吸引到代码块的特定部分时,相关的行或项目以粗体显示:

int main(void)
{
    auto execute_on_exit = finally{[]{
        std::cout << "The answer is: 42\n";
    }};
}

任何命令行输入或输出都编写如下:

> mkdir build && cd build
> cmake ..
> make recipe04_examples

粗体:表示一个新的术语、一个重要的单词或者你在屏幕上看到的单词。例如,重要的单词像这样出现在文本中。这里有一个例子:“在这个食谱中,我们将了解为什么在析构函数中抛出异常是一个坏主意

Warnings or important notes appear like this. Tips and tricks appear like this.

部分

在这本书里,你会发现几个经常出现的标题(准备怎么做...它是如何工作的...还有更多...参见

要给出如何完成配方的明确说明,请使用以下章节:

准备好

本节告诉您配方中的预期内容,并描述如何设置配方所需的任何软件或任何初步设置。

怎么做…

本节包含遵循配方所需的步骤。

它是如何工作的…

这一部分通常包括对前一部分发生的事情的详细解释。

还有更多…

本节包含关于配方的附加信息,以便您更好地了解配方。

请参见

本节提供了该配方的其他有用信息的有用链接。

取得联系

我们随时欢迎读者的反馈。

一般反馈:如果你对这本书的任何方面有疑问,在你的信息主题中提到书名,发邮件给我们customercare@packtpub.com

勘误表:虽然我们已经尽了最大的努力来保证内容的准确性,但是错误还是会发生。如果你在这本书里发现了一个错误,如果你能向我们报告,我们将不胜感激。请访问www.packtpub.com/support/errata,选择您的图书,点击勘误表提交链接,并输入详细信息。

盗版:如果您在互联网上遇到任何形式的我们作品的非法拷贝,如果您能提供我们的位置地址或网站名称,我们将不胜感激。请通过copyright@packt.com联系我们,并提供材料链接。

如果你有兴趣成为一名作者:如果有一个你有专长的话题,你有兴趣写或者投稿一本书,请访问authors.packtpub.com

复习

请留下评论。一旦你阅读并使用了这本书,为什么不在你购买它的网站上留下评论呢?然后,潜在的读者可以看到并使用您不带偏见的意见来做出购买决定,我们在 Packt 可以了解您对我们产品的看法,我们的作者可以看到您对他们的书的反馈。谢谢大家!

更多关于 Packt 的信息,请访问packt.com