图书前言

前言

欢迎阅读《学习C++20(中文版)》。本书旨在为软件开发人员介绍前沿的计算机编程语言,遵循的是ISO C++标准委员会在2020年9月通过的C++20标准(英文版有1834页)。

C++编程语言适合用来构建高性能的关键业务和关键任务计算系统,包括操作系统、实时系统、嵌入式系统、游戏系统、银行系统、空中管制系统以及通信系统等。本书的定位是帮助读者掌握C++语言,所以书中涵盖了C++语言本身(世界上最流行的编程语言之一)及其相关的标准库,对C++20进行了友好的、现代的、范例代码丰富的、面向案例的介绍。在这里,我们将探讨这本书的“灵魂”。

着眼于现代C++

本书专注于“现代C++”,包含了四个最新的C++标准:C++20、C++17、C++14和C++11,并对C++23以及更新的关键特性进行了展望。本书致力于探讨如何以一些新的和改进的方法用C++进行编码。我们采用的是最佳实践,强调当前专业软件开发的“现代C++”惯例,并将重点放在性能、安全性和软件工程这几个主题上。

保持话题性

“勇于传道授业解惑的人,是绝对不会停止进步的。”(约翰·科顿·达纳)

为了掌握“现代C++”的发展动态并改变开发人员用C++来写代码的方式,我们阅读、浏览或观看了最新的文章、研究论文、白皮书、文档以及博客帖子、论坛帖子和视频,数量累计超过6 000。

C++版本

作为开发人员,你可能要按项目要求解决C++遗留代码或使用特定的C++版本。为此,本书中提到了“C++20”这样的提示,以便每次提到某个“现代C++”语言特性时,你就知道它首次出现于C++哪个版本中。这些内容有助于你体会C++的发展历程:通常都是从低级别的细节,逐渐发展到更容易使用的高级别的表达形式。这个趋势有利于缩短开发时间、改善性能、提高安全性和系统可维护性。

目标读者

本书面向以下四类读者。

希望能够有一本内容全面、专业精深的教程可以帮助自己学习最新C++20特性的C++软件开发人员。

需要做C++项目并想学习最新语言特性的非C++软件开发人员。

在大学里学过C++或者在一段时间内因为职业需要用过C++并希望在C++20的背景下更新C++知识的软件开发人员。

计划开发C++20课程的C++职业培训师。

“实时编码”方法和代码下载

本书的核心内容是我们Deitel标志性的实时编码(Live-Code)方法。我们不展示代码片段,而是在数百个完整的、可运行的、具有实时输出的真实C++程序的背景下使用C++。

请阅读“前言”之后的“准备工作”部分,从中了解如何设置Windows、macOS或Linux计算机,以便运行大约由15 000行代码组成的200多个代码示例。所有源代码都可以在以下网站免费下载:

https://github.com/pdeitel/CPlusPlus20ForProgrammers

https://www.deitel.com/books/c-plus-plus-20-for-programmers

https://informit.com/title/9780136905691

为了提供方便,我们以C++源代码(后缀名为.cpp和.h)文件的形式提供本书的例子,供集成开发环境和命令行编译器使用。参见第1章的“试运行”一节(第1.2节),了解如何用我们推荐的三种编译器来编译和运行代码示例。在看书的同时执行每个程序,会有鲜活的学习体验。遇到任何问题,都可以通过deitel@deitel.com联系

我们。

三种工业强度的编译器

我们在以下最新版本的平台上测试了所有代码示例。

Windows?平台:Microsoft? Visual Studio?社区版的Visual C++?。

macOS?平台:Apple? Xcode?以及一个Docker?容器中的Clang C++(clang++)。

Linux?平台:GNU编译器集合(GCC)Docker?容器中的GNU? C++(g++)。

写作本书的时候,大多数C++20特性已经由所有三个编译器完全实现,有些由三个编译器中的一个子集实现,有些还没有由任何编译器实现。我们会酌情指出这些差异并在编译器厂商实现剩余的C++20特性时更新我们的数字版的内容。我们还会在本书的GitHub仓库中发布代码更新:

https://github.com/pdeitel/CPlusPlus20ForProgrammers

本书配套网站同时提供对代码和正文的更新:

https://www.deitel.com/books/c-plus-plus-20-for-programmers 

https://informit.com/title/9780136905691

本书中文版网站会提供中文版后期勘误:

https://bookzhou.com

编程技巧和C++20关键特性

本书使用多种图标来提醒读者留意软件开发技巧及C++20的模块和概念特征。

这类图标着重强调为正确开发软件而需要注意的架构和设计问题,特别是对于较大型的系统。

这样的最佳实践帮助大家加强程序安全以抵御攻击。

这一类提示给出了使你的程序运行得更快或尽量减少占用内存的窍门。

常见编程错误有助于减少犯同样错误的可能性。

C++核心准则建议(后面有具体说明)。

C++20新的模块特性。

C++20新的概念特性。

“对象自然”方法

第9章开始介绍如何开发自定义的C++20类并在后续章节继续讨论面向对象编程。

1. 何为对象自然

在第9章之前的各章,使用的是一些现有的类,它们能完成很多重要的工作。我们快速创建这些类的对象,并通过数量最少的简单C++语句让它们“大显身手”。这就是我们所称的“对象自然方法”(Objects-Natural Approach)。

C++社区已经创建了大量免费、开源的类库,所以在第9章学习如何创建自己的C++类之前,大多数读者就已经能够执行强大的任务了。这是使用面向对象语言(特别是C++这样成熟的面向对象语言)最吸引人的地方。

2. 免费的类

我们鼓励使用C++生态系统中现有的类,数量大且有价值、免费,它们通常有以下来源:

C++标准库

平台特有的库,如微软的Windows、苹果的macOS或各种Linux版本所提供的库

免费的第三方C++库,通常由开源社区创建

其他开发者,比如你所在组织的开发者

我们鼓励大家查看大量免费的、开源的C++代码实例(可在GitHub等网站上找到),从中找找灵感。

3. Boost项目

Boost提供了168个开源的C++库。它也是最终被纳入C++标准库之新特性的“温床”。一些已被添加到“现代C++”的特性包括多线程、随机数生成、智能指针、元组、正则表达式、文件系统和string_view。以下StackOverflow答案列出了从Boost库演变而来的“现代C++”库和语言特性:

https://stackoverflow.com/a/8852421

4. 对象自然案例学习

第1章主要学习解释对象技术的基本概念和术语。然后,到第9章之前,本书的重点都是创建并使用现有类的对象。在第9章及之后的各章,才会开始创建自定义类。我们的对象自然案例学习如下:

2.7节——创建并使用标准库string类的对象

3.12节——任意大小的整数

4.13节——使用miniz-cpp库读写ZIP文件

5.20节——Lnfylun Lhqtomh Wjtz Qarcv: Qjwazkrplm xzz Xndmwwqhlz(这是我们私钥加密案例学习的加密标题)

6.15节——C++标准库模板类vector

7.10节——C++20 span:连续容器元素的视图

8.19节——读取/分析包含泰坦尼克号灾难数据的CSV文件

8.20节——正则表达式简介

9.22节——用JSON序列化对象

对于对象自然,一个完美的例子是直接使用现有类的对象,如array和vector(第6章),而不需要知道如何编写自定义类,特别是不需要知道如何编写这些类。本书会广泛使用现有C++标准库的功能。

本书导读

全书各章内容如下所示。

这里描述了本书的许多关键特性。前几章为C++20的学习打下坚实的基础。后续涉及中高主题的章节和案例学习可以帮助大家轻松进入基于C++20的现代软件开发。贯穿全书,我们将讨论C++20的几种编程模型:

程序化编程

函数式编程

面向对象编程

泛型编程

模板元编程

第Ⅰ部分:编程基础

第1章:本书是为专业软件开发人员编写的,所以首先提供一个简单的介绍。其

次,讨论摩尔定律、多核处理器以及为什么标准化的并发编程在现代C++语言中很重要。最后,对面向对象做一个简单的回顾,介绍贯穿全书的术语。

接下来,直接进入试运行环节,演示如何用我们首选的三个免费编译器编译和执行C++代码:Windows平台是作为Visual Studio一部分提供的Microsoft Visual C++;macOS 平台是Apple Xcode;Linux平台是GNU g++。

我们使用每一种环境对书中的代码实例进行了测试,指出了少数编译器不支持某一特定语言特性的情况。请选择自己喜欢的程序开发环境。本书在其他C++20编译器中也能很好地工作。

我们还演示了GNU编译器集合(GCC) Docker容器中的GNU g++以及一个Docker容器中的Clang C++。这样一来,就可以在Windows、macOS或Linux上运行最新的GNU g++和clang++命令行编译器。关于Docker这种重要的开发工具的更多信息,请参见前面的介绍。要了解安装说明,请阅读“前言”之后的“准备工作”。

Windows用户也可以直接安装Linux,我们会指导你阅读微软提供的指示,通过Windows Subsystem for Linux(WSL)在Windows上安装Linux。这是在Windows上使用g++和clang++编译器的另一种方式。

第2章介绍C++的基础知识,说明关键的语言特性,包括输入、输出、基本数据类型、算术操作符及其优先级以及决策。2.7节的对象自然案例学习演示了如何创建并使用标准库提供的string类的对象。在这个时候,不必知道如何开发自定义类,特别是不必知道如何实现如此大型且复杂的类。

第3章的重点是控制语句。将开始学习if和if...else选择语句,用计数器控制和用哨兵控制的while循环语句,以及递增、递减和赋值操作符。3.12节的对象自然案例学习演示了如何使用第三方库来创建任意大小的整数。

第4章介绍C++的其他控制语句,包括for,do...while,switch,break和continue,还介绍了逻辑操作符。4.13节的对象自然案例学习演示了如何使用miniz-cpp库以编程方式写入和读取ZIP文件。

第5章介绍自定义函数。我们用随机数生成来演示模拟技术。C++从C语言继承的随机数生成函数rand不具备良好的统计特征,是可以预测的。我们讲解了C++11引入的更安全的随机数库,它能生成非确定性的随机数——一组无法预测的随机数。这种随机数生成器应用于那些不容许预测的模拟和安全场景。我们还讨论了函数之间的信息传递以及递归。5.20节的对象自然案例学习演示了私钥加密。

第Ⅱ部分:数组、指针和字符串

第6章初步讨论C++标准库的容器、迭代器和算法。我们介绍了C++标准库中用于表示值的列表和表格的array容器。将定义和初始化数组,并访问其元素。讨论了如何将数组传给函数,对数组进行排序和查找,以及操作多维数组。我们通过介绍lambda表达式(匿名函数)和C++20的“范围”——C++20的“四大”特性之一——来开始接触函数式编程。6.15节的对象自然案例学习演示了C++标准库的vector模板。本章实质是array和vector的一个大型的“对象自然”案例学习,其中的代码很好地演示了“现代C++”编码惯例(coding idiom)。

第7章全面介绍指针,并探讨内置指针、基于指针的数组和基于指针的字符串(也称为C字符串)之间的密切关系,所有这些都是C++从C语言继承的。指针很强大,但使用起来很有挑战性。为此,“现代C++”设计了一些特性来消除对大多数指针的需求,使代码变得更健壮、更安全。这些特性包括array和vector、C++20 span以及C++17 string_view。我们还是会讨论内置数组,它们在C++中依然有用,也是你看懂遗留代码所需要的。不过,如果是开发新项目,那么应该首选“现代C++”提供的能力。7.10节的对象自然案例学习展示的就是这样的一种能力:C++20 span。它使你能查看和操作连续容器(例如基于指针的数组以及标准库的array和vector)的元素,同时无须直接使用指针。本章再次强调了“现代C++”的编码

惯例。

第8章介绍标准库string类的许多特性,展示如何读写纯文本文件和以逗号分隔的CSV文件(常用于表示数据集),讨论如何用标准库的正则表达式(regex)功能进行字符串模式匹配。C++支持两种类型的字符串:string对象和C风格的、基于指针的字符串。我们使用string类的对象使程序变得更健壮,同时避免C字符串的许多安全问题。如果要开发新项目,那么应该首选string对象。我们还介绍了C++17的string_view,它是将任何类型的字符串传递给函数的一种轻量级的、灵活的机制。本章有两个对象自然案例学习。

8.19节通过读取并分析一个包含泰坦尼克号灾难数据集的CSV文件来介绍数据分析,这是向初学者介绍数据分析的一个流行的数据集。

8.20节介绍了正则表达式模式匹配和文本替换。

第Ⅲ部分:面向对象程序设计

第9章正式讨论面向对象编程,我们会编写一些有价值的自定义类。C++是一种可扩展的语言——你编写的每个类都会成为一个新类型,可基于它创建对象。9.22节的对象自然案例学习使用第三方库cereal将对象转换为JSON格式(序列化),并从其JSON表示中重新创建这些对象(反序列化)。

第10章主要讨论继承层次结构中类之间的关系以及这些关系所带来的强大的运行时多态处理能力。本章的一个重要方面是了解多态性是如何工作的。我们用插图和文字详细解释了C++于幕后如何实现多态性、虚函数和动态绑定。你会看到,语言使用了一种优雅的、基于指针的数据结构。我们还介绍了用于实现运行时多态性的其他机制,其中包括非虚接口(NVI)惯用法和std::variant/std::visit。本章还讨论了一个重要的编程原则:藉由接口来编程,而不要藉由实现(programming to an interface,not an implementation)。

第11章介绍如何使C++现有的操作符与自定义类的对象一起工作,并讨论了智能指针和动态内存管理。智能指针提供了内置指针所不具备的额外功能,能帮助大家避免动态内存管理错误。unique_ptr会在本章讨论,而shared_ptr和weak_ptr会在本书在线内容的第20章讨论。本章的一个关键点是教大家打造有价值的类。首先展示一个string类的例子,它优雅地运用了操作符重载技术。然后,教大家如何创建自定义类来实现该功能。接着是本书最重要的案例学习之一,你将利用重载操作符和其他功能创建自定义的MyArray类,从而解决C++原生的、基于指针的数组所存在的各种问题。我们介绍并实现了5种可在所有类中定义的特殊成员函数:拷贝构造函数、拷贝赋值操作符、移动构造函数、移动赋值操作符和析构函数。我们讨论了拷贝语义和移动语义,它们使编译器能够将资源从一个对象移动到另一个对象,以避免昂贵的、不必要的拷贝。我们介绍了C++20的三路比较操作符<=>(也称为“太空飞船操作符”),并演示了如何实现自定义转换操作符。第15章会着手将MyArray转换为一个可用于存储指定类型的元素的类模板,届时将真正打造出一个有价值的类。

第12章继续讨论第6章开始引入的异常处理。我们讨论了何时使用异常、异常安全保证、构造函数/析构函数中的异常、如何处理动态内存分配失败以及为什么有的项目不使用异常处理。本章最后还介绍了契约,这是未来C++可能会纳入的一个特性。我们通过godbolt.org网站上的一个实验性契约实现来进行说明。契约的一个目标是将大多数函数都变成noexcept,即指定函数不抛出异常。这可能允许编译器执行额外的优化,同时消除异常处理的开销和复杂性。

第Ⅳ部分:标准库容器、迭代器和算法

第13章开始更广泛和更深入地讨论三个关键的C++标准库组件:

容器(模板化数据结构)

迭代器(用于访问容器元素)

算法(用迭代器操作容器)

本章将讨论容器、容器适配器和近似容器,会讲到C++标准库提供的一些常用数据结构,这样就不必自行创建——我们的绝大多数数据结构需求都可通过重用这些标准库的功能来满足。我们演示了大多数标准库容器的用法,并介绍如何利用迭代器将算法应用于各种容器类型。本章还会提到,不同容器支持的是不同种类的迭代器。本章会继续演示如何利用C++20“范围”来简化代码。

第14章从标准库总计115种算法中选择了一部分来介绍,重点放在常见的容器操作上,其中包括用值填充容器、生成值、比较元素或整个容器、移除元素、替换元素、数学运算、查找、排序、交换、拷贝、合并、集合操作、确定边界以及计算最小值和最大值等。我们讨论了对迭代器的最低要求,这样就可以确定每种算法能使用哪些容器。本章开始讨论C++20四大特性中的另一个概念。C++20 std::ranges命名空间中的算法通过C++20“概念”来指定它们的要求。我们将通过C++20“范围” 和“视图”来拓展对C++函数式编程的讨论。

第Ⅴ部分:高级编程主题

第15章讨论如何使用模板进行泛型编程。自1998年C++标准发布以来,C++语言就一直支持“模板”的概念。随着C++每个新版本的发布,模板的重要性也日益增加。现代C++的一个重要趋势就是在编译时做更多的事情,以获得更好的类型检查和更好的运行性能。换言之,如果问题能在编译时解决,就能有效地避免运行时开销,使系统更快。如你所见,模板(特别是模板元编程)是实现强大的编译时处理的关键。本章将深入研究模板,展示如何开发自定义类模板,并探索C++20新增的“概念”。你将创建自己的“概念”,将第11章的MyArray案例学习转换为具有自己的迭代器的类模板,并与可接收任意数量模板实参的“可变参数模板”协同工作。本章会讨论如何进行C++元编程。

第16章介绍了C++20的另一个“四大”特性。模块是一种新的代码组织方法,能精确控制向客户代码公开哪些声明,同时封装实现细节。模块有助于提高开发人员的效率,特别是在构建、维护和演化大型软件系统的时候。模块使这些系统能更快地构建,并为其赋予更佳的可伸缩性。C++之父本贾尼·斯特诺斯特拉普(Bjarne Stroustrup)说:“模块为改善C++的代码整洁性和编译速度提供了一个历史性的机会(将C++带入21世纪)。”你会发现,即使是一些小型系统,模块也能通过消除对C++预处理器的需求,从而为每个程序带来直接的好处。我们本来想在程序中集成模块,但在写作本书时,市面上的主流编译器仍然缺失了多种模块功能。

第17章是本书中最重要的章节之一,讲解了C++如何为创建和管理多个任务的应用程序提供支持。这能显著提升程序的性能和可响应性。我们展示了如何使用C++17的预打包并行算法来创建多线程程序。这种程序在当今的多核计算机架构上运行得更快(而且通常快得多)。例如,我们做了个实验,对1亿个值先进行顺序排序,再进行并行排序。在逐渐增大核心数量的前提下,我们利用C++的<chrono>库来分析在当今流行的多核系统上获得的性能提升。你会看到,在使用了八核英特尔处理器的64位Windows 10计算机上,并行排序的运行速度达到了顺序排序的6.76倍。我们讨论了生产者–消费者关系,并演示了使用低级和高级C++并发基元(原语)来实现它的多种方法。这些基元包括C++20新增的latch(闭锁)、barrier(栅栏)和semaphore(信号量)。有必要强调一点,并发编程很难正确实现,所以应该尽可能地使用高级并发特性。像信号量和原子类型(atomic)这样的低级特性可以用来实现像闭锁这样的高级特性。

第18章介绍所谓的“协程”,这是C++20四大特性中的最后一个。协程是一种可以暂停执行并在稍后由程序的另一部分继续执行的函数。为其提供支持的机制完全由编译器自动为你生成的代码来处理。任何函数只要使用了co_await、co_yield和co_return关键字之一,就可以认为是一个协程。协程使你能以简单的顺序编码风格进行并发编程。协程需要一个复杂的基础结构,你可以自己写,但那样会很复杂、乏味而且容易出错。相反,大多数专家都认为,我们应尽可能使用高级协程支持库,本节演示的就是这种方法。开源社区已经创建了好几个实验性的库,使我们能快速、方便地开发协程,本书利用了其中两个。估计C++23会开始提供对协程的标准库支持。

附录

附录A按从高到低的优先级顺序列出了C++支持的操作符。

附录B列出了字符及其数字编码。

如何访问英文版在线章节和附录

我们在informit.com上提供了几个章节和附录(英文版)。可以按以下步骤注册本书并访问以下内容。

访问https://informit.com/register,用现有账户登录或者注册新账户。

在Register a Product区域的ISBN框中输入9780136905691,单击Submit按钮。

在个人账户页面的My Registered Products区域,单击C++20 for Programmers:

An Objects-Natural Approach下的Access Bonus Content链接。

随后将显示本书的在线内容页面,单击下载链接即可获取全部内容(40 MB以上)。

网上提供的章节

第19章(英文版)讨论标准的C++输入/输出功能和<iomanip>库遗留的格式化特性。之所以讨论这些格式化特性,是因为程序员可能在遗留C++代码中遇到它们。另外,本章还更深入地讨论了C++20新的文本格式化特性。

第20章(英文版)介绍C++其他的主题,并展望了C++23以及后续版本预期的新特性。

附录C(英文版)概述二进制、八进制、十进制和十六进制数字系统。

附录D(英文版)讨论C++预处理器的其他特性。我们在讨论模板元编程(第15章)和C++20模块(第16章)时,已经讨论过C++预处理器的许多特性,本附录只是起到查漏补缺的作用。

附录E(英文版)讨论了按位操作符,它们对整数操作数的单独的二进制位进行操作。另外,本附录还讨论了用于紧凑表示整数数据的“位域”。

配套网站deitel.com提供的其他资源

我们在deitel.com网站为本书设立了专页:

https://deitel.com/c-plus-plus-20-for-programmers

其中包含以下附加资源:

到GitHub仓库的链接,提供本书C++源代码的下载

博客文章:https://deitel.com/blog

本书后续更新

要想更进一步了解如何下载源代码以及C++开发环境的设置,请参见稍后的“准备工作”部分。

C++核心准则

C++“核心准则”打印出来大约有500页:

https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

它们由C++之父本贾尼·斯特诺斯特拉普(Bjarne Stroustrup)和ISO C++标准委员会召集人赫伯·萨特(Herb Sutter)编辑,旨在“帮助人们有效使用现代C++”。以下内容来自它的“摘要”:

“该准则聚焦于相对高层次的问题,例如接口、资源管理、内存管理以及并发等。这些规则影响的是应用程序架构和库的设计。和现今在代码中常见的情况相比,遵循这些规则可以保证代码的静态类型安全,无资源泄露,并能捕捉更多的编程逻辑错误。除此之外,还能使代码运行得更快,你将更容易地把事情做对。”

贯穿全书,我们将尽可能坚持这些准则。许多在“核心准则”中提供的建议我们都会用相应的图标指明。几百条核心准则被划分为多个类别和子类别。虽然信息量听起来似乎有点过度,但利用前面描述的静态代码分析工具,可以根据这些准则自动化检查代码。

准则支持库

“C++核心准则”经常提到一个“准则支持库”(Guidelines Support Library,GSL),它实现了用于为各种建议提供支持的辅助类和函数。微软在GitHub上提供了一个开源的GSL实现:

https://github.com/Microsoft/GSL

本书早期章节的一些例子已经在使用GSL特性,其中一些GSL特性后来被纳入C++标准库。

具有工业强度的静态代码分析工具

利用静态代码分析工具,可以快速检查代码是否存在常见的错误和安全问题,并提供代码改进意见。使用这些工具就像是让世界级的专家帮你检查代码。为了帮助我们遵守C++核心准则,并从总体上改进代码,我们使用了以下静态代码分析工具:

clang-tidy——https://clang.llvm.org/extra/clang-tidy/

cppcheck——https://cppcheck.sourceforge.io/

Microsoft的“C++核心准则”静态代码分析工具,它内置于Visual Studio的静态代码分析器中

使用上述三种工具,我们对本书代码示例进行检查以确认: 

遵循C++核心准则

遵循编码标准

遵循“现代C++”惯例

是否存在可能的安全问题

是否存在常见bug

是否存在可能的性能问题

代码的可读性

以及更多……

我们还在GNU g++和Clang C++编译器中使用了编译器标志-Wall来启用所有编译器警告。除了一些超出本书范围的警告,我们确保程序在编译时没有警告消息。要更多地了解静态分析工具的配置,请参见稍后的“准备工作”。

教学方法

本书包含丰富的“实时编码”示例。我们强调程序的清晰性,并专注于构建卓越的软件,使其足以体现良好的工程规范。

使用不同字体进行强调?关键术语加黑使其更醒目,C++代码使用等宽字体(例如,x = 5),并使用引号来表示界面元素(例如,“文件”菜单)。

学习目标和大纲?每一章都从“学习目标”开始,简单概括希望读者在本章达成的目标。

表格和插图?本书使用了大量的表格和插图。

编程技巧和关键特性?编程技巧和关键特性在页边用相应的图标表示。

开发者资源

1. 关于StackOverflow

StackOverflow是最受欢迎的面向开发人员的问答网站之一。程序员遇到的许多问题已经在这里讨论过了,所以是寻找这些问题的解决方案和发布新问题的一个好地方。在本书写作过程中,当我们在谷歌上查询各种问题(往往是复杂的那种)时,都会将StackOverflow的答案作为首选。

2. 关于GitHub

“要想成为程序员,最佳的途径就是自己动手写程序并研究其他人已经写好的优秀的程序。我自己以前经常去计算机科学中心翻废纸篓,找他们写的操作系统,研究他们是怎么写代码的。”

——比尔·盖茨

GitHub是寻找免费的开源代码并集成到自己项目中的一个很好的地方。如果你愿意的话,还可以将自己的代码贡献给开源社区。目前有超过8 300万名开发人员在使用GitHub。网站拥有超过2亿个以多种编程语言编写的代码仓库。仅仅过去一年,开发者就为6 100多万个代码仓库做出了贡献。GitHub为专业软件开发人员提供了版本控制工具,可以帮助开发团队管理公共开源项目和私人项目。

C++开源社区很庞大。在GitHub上,有超过47 000个C++代码仓库。你可以在GitHub上查看其他人的C++代码。如果喜欢,甚至可以在此基础上构建自己的。这是一种很好的学习方式,是我们的“实时编码”教学方法的自然延伸。

2018年,微软斥资75亿美元收购了GitHub。作为软件开发人员,你肯定会经常使用GitHub。根据微软首席执行官萨蒂亚·纳德拉的说法,该公司收购GitHub的目的是“尽一切努力让每个开发人员构建、创新和解决世界上最紧迫的挑战”。

我们鼓励大家研究并执行GitHub上大量的开源C++代码,贡献自己的代码。

3. 关于Docker

Docker是一种将软件打包成容器的工具,它捆绑了跨平台方便地执行该软件所需的一切。某些软件包要求进行复杂的安装和配置。对于许多这样的软件,你都可以下载现成的、免费的Docker容器,从而避免复杂的安装问题。然后,可以简单地在台式机或笔记本上本地执行软件,这使Docker成为帮助你快速、方便和经济地开始使用新技术的一个好方法。

我们展示了如何安装和执行Docker容器,预先配置了以下工具:

GNU编译器集合(GCC),其中包括g++编译器

最新版Clang的clang++编译器

两者都可以在Windows、macOS和Linux平台上的Docker中运行。

Docker还有助于实现“可重复”或“再现”。自定义Docker容器可以使用你当前选择的软件和库来配置。这使其他人能重建你的环境,并再现你的工作,也能帮助你再现自己的结果。可重复在科学和医学领域尤其重要,例如,在研究人员想要对已发表文章中的工作进行证明和扩展的时候。

一些重要的C++文档和资源

本书引用了视频、博客、文章和在线文档,总数超过900个。在阅读本书的过程中,建议大家根据需要访问这些资源中的一些,去研究更多的高级特性和编程惯例。zh.cppreference.com网站已成为事实上的C++文档网站。我们会时常引用它,方便大家获得标准C++类和函数的更多细节。我们还会经常引用C++20标准文件的最终草案,它可从GitHub上免费获取,网址如下:

https://timsong-cpp.github.io/cppwp/n4861/

在阅读本书的过程中,以下C++资源也会很有帮助。

1. 文档

由C++标准委员会通过的C++20标准文档最终草案:https://timsong-cpp.github.io/cppwp/n4861/

zh.cppreference.com提供的“C++参考手册”:https://zh.cppreference.com/

Microsoft的C++语言文档:https://docs.microsoft.com/zh-cn/cpp/cpp

GNU C++标准库参考手册:https://gcc.gnu.org/onlinedocs/libstdc++/manual/index.html

2. 博客

Sutter's Mill博客,这是Herb Sutter的软件开发博客:https://herbsutter.com/

Microsoft C++团队的博客:https://devblogs.microsoft.com/cppblog

Marius Bancila的博客:https://mariusbancila.ro/blog/

Jonathan Boccara的博客:https://www.fluentcpp.com/

Bartlomiej Filipek的博客:https://www.cppstories.com/

Rainer Grimm的博客:http://modernescpp.com/

Arthur O'Dwyer的博客:https://quuxplusone.github.io/blog/

3. 其他资源

C++之父的网站:https://stroustrup.com/

Standard C++ Foundation网站:https://isocpp.org/

C++标准委员会网站:http://www.open-std.org/jtc1/sc22/wg21/

自己找答案

C++和常规编程网上论坛如下:

https://stackoverflow.com

https://www.reddit.com/r/cpp/

https://groups.google.com/g/comp.lang.c++

https://www.dreamincode.net/forums/forum/15-c-and-c/

其他有价值的网站可参见网站https://tinyurl.com/2npmj3ld列出的清单。

另外,厂商经常为他们的工具和库提供论坛。许多库是在github.com上管理和维护的。某些库的维护者会通过该库的GitHub页面上的“议题”(issues)标签提供支持。

与作者沟通

阅读本书的过程中遇到任何问题,可以通过deitel@deitel.com联系我们,我们会及时做出答复。

加入Deitel & Associates公司的社交媒体社群

Deitel的社交媒体账号如下:

LinkedIn?——https://bit.ly/DeitelLinkedIn

YouTube?——https://youtube.com/DeitelTV

Twitter?——https://twitter.com/deitel

Facebook?——https://facebook.com/DeitelFan

O'Reilly Online Learning提供的Deitel Pearson产品

你所在的公司或大学或许已经订阅了O'Reilly Online Learning,因而能免费访问我们Deitel在培生出版的所有电子书和LiveLessons视频。除此之外,还能免费访问Paul Deitel提供的为期一天的Full Throttle培训课程。个人可在以下网址注册10天免费试用:

https://learning.oreilly.com/register/

要完整了解O'Reilly Online Learning提供的最新产品和课程,请访问以下网址:

https://deitel.com/LearnWithDeitel

教科书和专业书

O'Reilly Online Learning提供的每一本Deitel电子书(英文版)都是全彩的,提供了全面的索引和文本查找功能。我们每写一本专业书,都会提前发布到O'Reilly Online Learning上,供早期的试读。定稿之后,会替换成最终内容。本书英文版的最终版电子书可访问以下网址:

https://learning.oreilly.com/library/view/c-20-for-programmers/9780136905776

LiveLessons视频课程

和作者保罗(Paul Deitel)一起动手学,视频中介绍了C++、Java、Python以及Python数据科学/人工智能中大家关注的前沿计算技术(还有更多即将推出)。O'Reilly订阅者可通过以下网址访问本书的LiveLessons视频:

https://learning.oreilly.com/videos/c-20-fundamentals-parts/9780136875185

这些视频是自己掌握学习进度时的理想选择。本书写作时,我们仍在录制这个产品。其他视频在2022年第1季度和第2季度发布。最终的视频产品将包含50~60小时的视频,大约相当于大学两个学期的课程。

Full-Throttle直播培训课程

作者保罗(Paul Deitel)在O'Reilly Online Learning网站提供Full-Throttle(快节奏)直播培训课程:

https://deitel.com/LearnWithDeitel

这是我们推出的为期一天的、仅授课(无学生互动)、快节奏的、代码密集型的直播授课方式,主题涉及Python、Python数据科学/AI、Java、C++20基础和C++20标准库。这些课程的目标学员是有经验的开发人员和软件项目经理,他们准备选择一种新的语言来完成项目,所以需要大致了解一下。在完成一节Full-Throttle课程后,学员通常可以选择观看相应的LiveLessons视频课程,授课时间更长,并符合课堂学习的节奏。

讲师指导的现场培训

三十年来,作者保罗(Paul Deitel)一直在为开发人员教授编程语言。他开设了各种为期一至五天的C++、Python和Java企业培训课程,并为加州大学洛杉矶分校安德森管理学院的商业分析科学硕士(MSBA)讲授Python与数据科学入门课程。他可以在全球范围内开展线下或线上授课。请联系deitel@deitel.com,获得为贵公司或学术项目定制的方案。

本书的大学教科书版

本书的大学教科书版本是《C++程序设计》,最新版是第11版,它以三种数字格式提供:

主流电子书供应商提供的网上电子书

交互式Pearson eText(见下)

带考评功能的交互式Pearson Revel(见下)

所有这些教科书版本都支持标准的“How to Program”特色,例如:

专门用一章来介绍硬件、软件和互联网的概念

面向新手介绍编程

节末的编程和非编程检查点自测练习(附答案)

章末练习

Deitel Pearson eText和Revel版本包括以下内容: 

Paul Deitel讲解书中核心章节材料的视频

交互式的编程和非编程检查点自测题(附答案)

抽认卡和其他学习工具

此外,Pearson Revel还支持交互式编程和非编程的自动考评练习,还提供教师课程管理工具,比如成绩册。

如果通过申请的大学教师用教科书进行教学的话,还可获得以下补充资源:

教参,包括大多数章末练习的答案

课堂作业文件,包括分为基于代码和非代码的多选题及答案

可定制的PowerPoint课堂幻灯片

请发送邮件至deitel@deitel.com,了解详情。

致谢

感谢Barbara Deitel为本项目所做的长期性网上研究。很幸运能与培生(Pearson)的专业出版团队合作。感谢朋友和同事Pearson IT Professional Group副总裁马克·L. 陶伯(Mark L. Taub)的努力和对我们长达27年的指导。他与其团队出版我们的专业书籍和LiveLessons视频产品,并赞助我们通过O'Reilly Online Learning服务向读者提供实时在线培训:

https://learning.oreilly.com/

Charvi Arora招募本书的审稿人团队并管理审稿过程。感谢Julie Nahil对本书英文版的制作过程进行管理。感谢Chuti Prasertsith设计英文版封面。

技术审稿人

在本项目中,我们很幸运地邀请到10位杰出的专业人士来审校我们的书稿。大多数审稿人或者是ISO C++标准委员会的成员,或者曾在该委员会任职,或者与委员会有工作关系。许多人都为C++语言做出了一些贡献。他们帮助我们做成了一本更好的书,书中如果还有任何差错,那么肯定是我们自己的问题。

Andreas Fertig,独立C++培训师和顾问,cppin-sights.io的创建者,Programming with C++20一书的作者。

Marc Gregoire,Nikon Metrology公司的软件架构师,微软MVP(Visual C++方向)和Professional C++第5版的作者(本书针对C++20)。

Daisy Hollman博士,ISO C++标准委员会成员。

Danny Kalev博士和认证系统分析师/软件工程师,ISO C++标准委员会前成员。

Dietmar Kühl,Bloomberg L. P.高级软件开发师,ISO C++标准委员会成员。

Inbal Levi,SolarEdge Technologies,ISO C++基金会总监,ISO C++ SG9(“范围”)主席,ISO C++标准委员会成员。

Arthur O'Dwyer,C++培训师,CppCon的“Back to Basics”分主题主席,几个已被接受的C++17/20/23提案以及Mastering the C++17 STL一书的

作者。

Saar Raz,彭博社高级软件工程师,Clang中C++20“概念”的实现者。

José Antonio González Seco,安达卢西亚议会议员。

Anthony Williams,英国标准协会C++标准小组成员,Just Software Solutions公司的总监,C++ Concurrency in Action第2版的作者(许多C++标准委员会文件的作者或共同作者,这些文件最终促成了C++标准化的“并发”特性)。

特别感谢Arthur O'Dwyer

我们想要强调他为审校本书所付出的非凡努力。通过看他的批注,我们学到了很多C++的精妙之处,特别是一些“现代C++”编码惯例。除了仔细批注我们发给他的每一章PDF文件,他还单独提供了一份综合性的文档来详细解释自己的意见,还经常重写代码并提供外部参考资源以提供额外的见解。当我们在综合所有审稿人的意见时,总是期待他的,特别是涉及更具挑战性的问题时。他虽然很忙,但对审校工作很慷慨,而且总是富有建设性。他坚持要求我们“把书做好”并努力帮助我们做到这一点。他面向专业人士教授C++编程。他教会了我们如何正确使用C++。

GitHub

感谢GitHub使我们能轻松分享代码并保持更新,它提供的工具使8 300多万开发者能够为2亿多个代码仓库做出贡献。这些工具支持大规模开源社区,为当今流行的编程语言提供库,使开发者更容易创建强大的应用程序,同时避免“重新发明轮子”。

特别感谢Matt Godbolt和Compiler Explorer

感谢Compiler Explorer的创造者Matt Godbolt(https://godbolt.org)。这个工具能编译和运行以多种编程语言写的程序。通过这个网站,可以这样测试自己写的代码:

在大多数流行C++编译器上测试,其中包括我们首选的三个编译器

在许多已发布的、开发中的和实验性的编译器版本上测试

例如,我们使用了一个实验性的g++编译器版本来演示“契约”(参见第12章),该特性有望在未来的C++语言版本中标准化。我们的几位审稿人使用godbolt.org向我们展示了建议的修改,以这种方式来帮助我们改进。

特别感谢Dietmar Kühl

感谢彭博社L. P.高级软件开发师和ISO C++委员会成员Dietmar Kühl,他与我们分享了他对继承、静态/动态多态性的看法。他的见解帮助我们完善了第10章和第15章对这些主题的讲述。

特别感谢Rainer Grimm

感谢Rainer Grimm(http://modernescpp.com/),他是“现代C++”社区最多产的博主之一。随着我们对C++20的深入了解,我们的谷歌搜索经常指向他的著作。Rainer Grimm是一位专业的C++培训师,提供德语和英语课程。他是几本C++书籍的作者,包括C++20: Get the Details ++20 Concurrency with Modern C++、The C++ Standard Library和C++ Core Guidelines Explained。他已开始在博客上介绍有望在C++23中出现的特性。

特别感谢Brian Goetz

我们有幸邀请到Oracle的Java语言架构师和Java Concurrency in Practice合著者Brian Goetz对我们的另一本书Java How to Program(第10版)进行审稿。他为我们提供了许多见解和建设性的意见,具体如下。

继承层次的设计,这影响着本书第10章中几个例子的设计决策。

Java并发性,这影响着本书第17章中对C++20并发性的讲述。

开源贡献者和博客作者

特别感谢全世界为开源运动做出贡献并在网上发表博客的技术人员,感谢大力支持开源软件和信息的组织。

谷歌搜索

感谢谷歌,它的搜索引擎回答了我们的查询,每次都可以在几分之一秒内完成,无论白天还是晚上,而且还免费。这是我们过去20年的研究过程中所享受到的最好的生产力提升工具,没有之一。

Grammarly

我们现在对所有稿件都使用Grammarly付费版本。这个工具被描述成“AI写作助手”,能帮助你“写出大胆、清晰、没有错误的文章”。他们还说:“利用各种创新方法——包括先进的机器学习和深度学习——我们不断在自然语言处理(NLP)研究方面取得新的突破,为用户提供无与伦比的帮助。”Grammarly提供免费工具,可以将其整合到流行的Web浏览器、Microsoft? Office 365?和Google Docs?中。他们还提供更强大的高级和商业工具。可以访问以下网址查看他们的免费和付费

套餐:

https://www.grammarly.com/plans

在你阅读本书并使用代码示例时,我们感谢你对此发表评论、批评、指正和改进建议。包括疑问在内的所有信件请发送到deitel@deitel.com,我们会及时做出答复。

欢迎来到令人振奋的C++20编程世界。过去30年,我们总共写了11版的学术和专业C++书籍。我们希望本书能为您提供一个信息丰富、兼具挑战性和娱乐性的学习体验,并帮助您迅速进入“现代C++”软件开发的状态。

关于作者

保罗·戴特尔(Paul Deitel)是Deitel & Associates公司CEO兼CTO,拥有42年计算机行业的工作经验,早年毕业于麻省理工学院。作为全球最有经验的编程语言培训师之一,他从1992年以来,就一直为软件开发人员教授专业课程。他向Deitel & Associates公司的院校、行业、政府和军事客户提供了数以百计的编程课程,这些客户包括加州大学洛杉矶分校(UCLA)、思科(Cisco)、IBM、西门子(Siemens)、Sun Microsystems(现在的Oracle)、戴尔(Dell)、Fidelity、肯尼迪航天中心的NASA、美国国家强风暴实验室(National Severe Storm Laboratory)、白沙导弹发射场(White Sands Missile Range)、Rogue Wave Software、波音(Boeing)、彪马(Puma)和iRobot等。他与哈维·M. 戴特尔(Harver M. Deitel)博士合作打造了全球最畅销的编程语言教材、专业书籍、视频和互动多媒体电子学习内容,做过许多线上和线下的培训以及虚拟/现场培训的主持人。

哈维·M. 戴特尔博士是Deitel & Associates公司主席兼首席战略官,拥有超过61年的计算机行业工作经验。他早年在麻省理工学院获得电子工程学士和硕士学位,在波士顿大学获得数学博士学位——在计算机科学专业从这些专业分离出去之前,戴特尔博士已经学过计算机知识。他拥有丰富的大学教学经验。在与儿子保罗1991年创办Deitel & Associates公司之前,他是波士顿大学计算机科学系主任并拥有终身教职。他们的出版物享有国际声誉并被翻译成日文、德文、俄文、西班牙文、法文、波兰文、意大利文、中文、韩文、葡萄牙文、希腊文、乌尔都文和土耳其文。他为许多大公司、学术机构、政府部门和军事机构提供了数百场专业编程培训。

Deitel & Associates公司简介

Deitel & Associates公司由两位作者共同创办,是一家国际知名的内容创作和企业培训组织,擅长计算机编程语言、对象技术、移动应用开发以及互联网和Web软件技术。公司培训的客户包括一些全球最大型的公司、政府机构、军事部门和学术机构。公司提供讲师现场指导的培训课程,为世界各地的客户提供虚拟或现场培训,并在O'Reilly Online Learning上为培生教育提供线上培训(https://learning.oreilly.com)。

通过与培生公司超过47年的出版合作,Deitel & Associates以纸质版和电子书形式出版了大量行业领先的编程专业书籍和大学教科书、LiveLessons视频课程、O'Reilly Online Learning实时培训课程和Revel?交互式多媒体大学课程。

如需联系Deitel & Associates公司和作者或要求提供全球范围内的虚拟或现场由讲师指导的培训方案,请发送电子邮件到以下邮箱:

deitel@deitel.com

要想进一步了解Deitel的虚拟和现场企业培训,请访问以下网站:

https://deitel.com/training

个人如需购买Deitel的书籍,请访问以下网站:

https://amazon.com

https://www.barnesandnoble.com/

企业、政府、军队和学术机构的大宗订单应直接联系培生公司。企业和政府销售请发送电子邮件到以下邮箱:

corpsales@pearsoned.com

Deitel电子书支持各种格式,请访问以下网站购买:

https://www.amazon.com/ https://www.vitalsource.com/

https://www.barnesandnoble.com/ https://www.redshelf.com/

https://www.informit.com/ https://www.chegg.com/

如需注册10天免费的O'Reilly Online Learning,请访问以下网站:

https://learning.oreilly.com/register/

准备工作

在使用本书之前,请先了解本书采用的约定,并设置好计算机以编译和运行示例程序。

字体和命名约定

C++代码元素使用等宽代码字体,例如sqrt(9)。

提到屏幕元素时会使用引号,例如“文件”菜单。

提到菜单操作的时候,会用“|”来表示从一个菜单中选择菜单项。所以,“文件”|“打开”意味着从“文件”菜单中选择“打开”。

提到组合键的时候用加号连接,例如“按Ctrl+F5”。

获得代码示例

我们在一个GitHub仓库中维护本书的代码示例。本书主页(https://deitel.com/cpp20fp)的Source Code区域提供了到该GitHub仓库的链接,还提供了源代码ZIP文件的下载链接。如果大家熟悉Git和GitHub,就把仓库克隆到自己的系统中。如果下载了ZIP文件,一定要解压其中的内容。本书假定这些示例已存储到用户账户下的“文档”文件夹中的一个名为examples的子文件夹中,如下图所示。

如果不熟悉Git和GitHub,但又有兴趣了解这些基本的开发工具,请查看指南:

https://guides.github.com/activities/hello-world/

本书使用的编译器

在阅读本书之前,请确保已经安装最新的C++编译器。我们使用了以下免费编译器来测试本书的全部代码示例。

在Microsoft Windows上使用的是Microsoft Visual Studio社区版,其中包括Visual C++编译器和其他Microsoft开发工具。

在macOS上使用的是Apple Xcode C++编译器,后者使用Clang C++编译器的一个版本。

在Linux上使用的是GNU C++编译器——GNU Compiler Collection(GCC)的一部分。GNU C++在大多数Linux系统上已经安装(虽然可能需要将编译器更新到一个较新的版本),并且可以安装到macOS和Windows系统上。

还可以通过Docker容器在Windows、macOS和Linux上方便地运行最新版本的GNU C++和Clang C++。请阅读稍后的“Docker和Docker容器”一节。

稍后会讲述编译器和Docker的安装。1.2节的试运行环节演示了如何使用这些编译器编译和运行C++程序。

某些例子不能在所有三种编译器上编译和运行

本书英文版写作时(2022年2月),编译器厂商还没有完全实现C++20的一些新特性。一旦这些特性可用,我们会重新测试代码,更新我们的数字产品,并在以下网站发布纸质版的更新信息:

https://deitel.com/cpp20fp

在Windows上安装Visual Studio社区版

如果是Windows用户,首先确定自己的系统满足Microsoft Visual Studio社区版的系统需求:https://docs.microsoft.com/zh-cn/visualstudio/releases/2022/system-requirements。

接着访问https://visualstudio.microsoft.com/downloads/

再执行以下安装步骤。

单击“社区”区域的“免费下载”。

取决于所用的Web浏览器,文件下载回来后可能会在屏幕底部弹出一个提示,单击“运行”即可开始安装。如果是Chrome浏览器,单击下载回来的文件名即可开始安装。否则,请自行启动“下载”文件夹中的安装程序。

如果出现“用户账户控制”对话框,单击“是”允许安装程序修改自己的系统。

在Visual Studio Installer对话框中,单击“继续”允许安装程序下载配置安装所需的一些组件。

对于本书的示例,请勾选“使用C++的桌面开发”,其中已包含Visual C++编译器和C++标准库。

单击“安装”。取决于网速,安装过程可能需要花一些时间。

在macOS上安装Xcode

在macOS上执行以下步骤安装Xcode。

单击苹果图标,选择App Store...或者单击Mac屏幕底部Dock栏上的App Store图标。

在App Store的搜索栏中,输入Xcode。

单击“获取”按钮并安装Xcode。

安装最新的GNU C++版本

目前有许多Linux发行版,它们通常采用不同的软件升级技术。请查阅你所使用的发行版的联机文档,了解将 GNU C++ 升级到最新版本的正确方法。也可以从以下网站下载适用于各种平台的GNU C++:

https://gcc.gnu.org/install/binaries.html

用WSL运行 Ubuntu Linux 并安装 GNU 编译器集合

可以通过“适用于Linux的Windows子系统”(Windows Subsystem for Linux,WSL)在Windows上安装GNU Compiler Collection。有了WSL,就能在Windows上运行Linux。Ubuntu Linux在Windows商店中提供了一个易于使用的安装程序,但首先必须安装好WSL。

在任务栏的搜索框中,输入“启用或关闭”,在搜索结果中单击“启用或关闭Windows功能”。

在“Windows功能”对话框中找到“适用于Linux的Windows子系统”。如果它已被选中,就表明WSL已经安装。否则,选中它并单击“确定”。Windows将安装WSL并要求你重启系统。

系统重启后,打开Microsot Store应用并搜索Ubuntu,选择名为Ubuntu的应用程序并点击安装。这就安装了最新版本的Ubuntu Linux。

安装好后单击“打开”按钮来显示Ubuntu Linux命令行窗口,这将继续安装过程。会要求你为这个Ubuntu安装创建用户名和密码(不需要与自己的Windows用户名和密码相同)。

Ubuntu安装完成后,执行以下两个命令来安装GCC和GNU调试器,可能会要求你为第4步创建的账户输入密码:

sudo apt-get update

sudo apt-get install build-essential gdb

执行以下命令来确认g++已成功安装:

g++ --version

为了访问我们的代码文件,使用cd将文件夹更改为以下形式:

cd /mnt/c/Users/你的用户名/Documents/examples

将用户名换成自己的,将路径更新为自己系统中存储了本书示例的位置。

Docker和Docker容器

Docker是一个将软件打包到容器(也叫映像)中的工具。容器捆绑了跨平台执行该软件所需的一切,这对需要进行复杂安装和配置的软件包特别有用。许多这样的软件包都提供了免费的、现有的Docker容器(通常放在https://hub.docker.com),可以下载并在自己的系统上本地执行。Docker是开始使用新技术的一种快速、方便的方法,也特别适合试验新的编译器版本。

安装Docker?使用Docker容器必须先安装好Docker。Windows用户和macOS用户请从以下网站下载并运行Docker Desktop安装程序,网址为https://www.docker.com/get-started。

然后按照屏幕上的指示操作。另外,可以在这个网页上注册一个Docker Hub账户,以便利用https://hub.docker.com提供的各种容器。Linux用户应该从以下网站安装Docker Engine,网址为https://docs.docker.com/engine/install/。

下载GNU Compiler Collection Docker容器?GNU团队在以下网页维护其官方Docker容器,网址为https://hub.docker.com/_/gcc。

Docker安装好并开始运行后,请打开一个“命令提示符”(Windows)、Terminal(macOS/Linux)或者shell(Linux),然后执行以下命令:

docker pull gcc:latest

Docker会下载GNU编译器集合(GCC)容器的最新版本(本书英文版写作时是版本11.2)。在1.2节的一次试运行中,我们会演示如何执行容器并用它编译和运行C++程序。

下载Clang Docker容器?目前,Clang团队没有提供官方Docker容器,但https://hub.docker.com提供了许多可用的。本书英文版使用了其中一个比较流行的容器,网址为https://hub.docker.com/r/teeks99/clang-ubuntu。

打开一个“命令提示符”(Windows))、Terminal(macOS/Linux)或者shell(Linux),然后执行以下命令:

docker pull teeks99/clang-ubuntu:latest

Docker会下载Clang容器的最新版本(本书英文版写作时是版本13)。在1.2节的一次试运行中,我们会演示如何执行容器并用它编译和运行C++程序。

C++答疑解惑

如果在阅读本书的过程中遇到任何问题,请发送电子邮件到以下邮箱:

deitel@deitel.com。

或者访问https://deitel.com/contact-us,我们会及时回复。

网上有丰富的编程资料可供参考,其中一个宝贵的资源是https://stackoverflow.com网站,无论是程序员还是非程序员,都觉得它非常好用。

查找最常见的编程问题的答案。

查找错误消息,了解出错原因。

提出编程问题,从世界各地的程序员那里获得答案

获得关于编程的宝贵见解

如果想参与实时的C++讨论,请访问Slack的cpplang频道:https://cpplang-inviter.cppalliance.org。

Discord服务器#include<C++>:https://www.includecpp.org/discord/。

在线C++文档

要查看C++标准库文档,请访问https://zh.cppreference.com。

另外,一定要看一下C++ FAQ:https://isocpp.org/faq。

关于{fmt}文本格式化库

本书许多程序都包含下面这一行代码:

#include <fmt/format.h>

这使得我们的程序能够使用开源的{fmt}库的文本格式化功能。这些程序包含了对fmt::format函数的调用。

新的C++20文本格式化功能是{fmt}库所提供的特性一个子集。在C++20中,上面这行代码应写成以下形式:

#include <format>

还应修改函数调用,变成调用std::format函数。

但在本书写作时,只有Microsoft Visual C++支持新的C++20文本格式化功能。所以,本书的例子使用了开源{fmt}库,以确保大部分示例能在我们首选的全部编译器上执行。

静态代码分析工具

我们使用以下静态代码分析工具来检查我们的代码实例是否遵循“C++核心准则”、是否遵循编码标准、是否遵循“现代C++”惯例,以及是否有可能的安全问题、常见bug、可能的性能问题以及代码可读性等:

clang-tidy—https://clang.llvm.org/extra/clang-tidy/

cppcheck—https://cppcheck.sourceforge.io/

Microsoft的C++核心准则静态代码分析工具,它内置于Visual Studio的静态代码分析器中

可用以下命令在Linux上安装clang-tidy:

sudo apt-get update -y

sudo apt-get install -y clang-tidy

可以按照https://cppcheck.sourceforge.io/上的说明,为多种操作系统平台安装cppcheck。对于Visual C++,一旦通过1.2节的试运行环节学会了如何创建项目,就可以按以下方式配置Microsoft的C++核心准则静态代码分析工具。

在解决方案资源管理器中右击项目名称,选择“属性”。

在随后出现的对话框中,在左栏中选择“代码分析”|“常规”,然后在右栏中将“生成时启用代码分析”设为“是”。

接着,在左栏中选择“代码分析”|Microsoft,然后在右栏中,从下拉列表中选择分析规则的一个特定子集。我们使用选项“<选择多个规则集...>”来选择所有以C++ Core Check开头的规则集。单击“另存为...”,为自定义规则集起个名字,单击“保存”,然后单击“应用”(注意,这会为本书示例中使用的{fmt}文本格式化库产生大量警告)。