在这本书里,你将学习高级的 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_ptr和std::shared_ptr、如何处理循环引用、如何键入强制转换智能指针,以及堆如何在幕后工作,为你的应用提供动态内存。
第 11 章、C++ 中的常见模式解释了计算机科学中不同的模式是如何在 c++ 中实现的,包括工厂模式、单例模式、装饰器模式和观察者模式,以及如何实现静态多态来编写自己的静态接口,而不需要虚拟继承。
第 12 章、仔细看看类型推导,深入探究了在 C++ 17 中如何进行类型推导,包括auto、decltype和template如何自动推导它们的类型。本章以如何编写自己的 C++ 17 用户定义推导指南的例子结束。
第 13 章奖励:使用 C++ 20 特性,提供了 C++ 20 新特性的预览,包括概念、模块、范围和协同程序。
我们假设您以前写过 C++ 并且已经熟悉了一些现代 C++ 特性。
这本书使用 Ubuntu 来提供例子,你可以在阅读这本书的时候自己编译和运行。我们假设您对 Ubuntu、如何安装它以及如何使用 Linux 终端有一些基本的了解。
我们在一些食谱中使用反汇编器来更好地理解编译器在幕后做什么。虽然您不需要知道如何阅读程序集来理解正在教授的内容,但是对 x86_64 程序集的基本理解将会有所帮助。
你可以从你在www.packt.com的账户下载这本书的示例代码文件。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support并注册将文件直接通过电子邮件发送给您。
您可以按照以下步骤下载代码文件:
- 登录或注册www.packt.com。
- 选择“支持”选项卡。
- 点击代码下载。
- 在搜索框中输入图书的名称,并按照屏幕指示进行操作。
下载文件后,请确保使用最新版本的解压缩文件夹:
- 视窗系统的 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。