现代C++编程:从入门到实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

拿起画笔,和我们一起画画吧!

——Bob Ross

系统编程的需求是巨大的。随着浏览器、移动设备和物联网应用于我们的生活,也许从来没有一个时刻像现在这样,这是人们成为一名系统程序员的最佳时机。在任何情况下我们都需要高效、可维护和正确的代码,而我坚信C++是最适合这项工作的语言。

在经验丰富的程序员手中,C++可以产生比地球上任何其他系统编程语言所能产生的更小、更高效、更可读的代码。它是一种致力于实现零开销抽象机制的语言——因此程序可以快速地被开发,同时也可以简单、直接地映射到硬件上。因此,当需要时,我们也可以进行底层控制。当用C++编程时,我们其实已经站在了巨人的肩膀上,他们花了几十年的时间精心设计了一门令人难以置信的强大而灵活的语言。

学习C++的一大好处是可以免费获得C++标准库,即stdlib。stdlib包含三个相互关联的部分:容器、迭代器和算法。如果你曾经手动编写过quicksort算法,或者曾经编写过系统代码并受到缓冲区溢出、悬空指针、使用已释放内存和重复释放内存等问题的困扰,那么你会喜欢stdlib的。它可以同时为你提供无与伦比的类型安全、正确性和效率。此外,你会为代码的紧凑和富有表现力而欣喜。

C++编程模型的核心是对象生命周期,它为正确释放程序所使用的资源(如文件、内存和网络套接字)提供了强有力的保证,即使在发生错误时。而异常,当正确使用时,可以从代码中去掉大量的错误检查。另外,移动/复制语义在管理资源所有权方面兼顾了安全性、效率和灵活性,而早期的系统编程语言(如C语言)根本没有提供这类功能。

C++是一门活跃的语言,30多年来,国际标准化组织(International Organization for Standardization,ISO)的C++委员会定期对该语言进行改进。在过去的十几年中,该标准已经发布了几个新版本,即C++11、C++14、C++17和C++20,它们分别于2011年、2014年、2017年和2020年发布。

当我使用“现代C++”(modern C++)这个术语时,指的是包含新的功能和范式的最新标准。这些更新对该语言进行了认真的改进,提高了它的表现力、效率、安全性和整体可用性。从某种程度上说,这门语言从未像现在这样流行,它也不会很快消失。如果你决定学习C++,那么你将在未来几年内得到回报。

写作目的

虽然现代C++程序员已经可以接触到一些质量非常高的书籍,如Scott Meyer的Effective Modern C++和Bjarne Stroustrup的The C++ Programming Language(第4版),但它们通常是面向高级程序员的。也有一些介绍性的C++书籍,但因为它们是为初学编程的人准备的,所以往往会跳过一些关键的细节。而对于有经验的程序员来说,往往不知道去哪里学习C++。

我更喜欢有意识地学习复杂的命题,从其最基本的元素开始建立概念。C++之所以获得“C++是一门复杂的语言”的评价,是因为它的基本元素紧密地嵌套在一起,使得我们很难对这门语言有一个完整的认识。当我自己学习C++的时候,我不得不辗转于书本、视频和疲惫的同事之间,费尽心思地去弄懂这门语言。基于此,我写了这本我认为很早之前就应该有的书。

读者对象

本书是为已经熟悉基本编程概念的中高级程序员编写的。如果你没有专门的系统编程经验,那没关系,本书也适合有经验的应用程序员。

注意 如果你是一名经验丰富的C语言程序员或者有抱负的系统程序员,想知道是否应该学习C++,请务必阅读“致C语言程序员”,以了解详情。

本书内容

本书分为两部分。第一部分讨论C++语言核心。读者不需要按时间顺序学习C++语言(即从C++98开始一直学到现代的C++11/14/17),而是可以直接学习地道的现代C++。第二部分介绍C++标准库(stdlib),在这里读者将学到最重要的基本概念。

第一部分 C++语言核心

第1章:启动和运行 本章将帮助你建立C++开发环境。你将编译和运行第一个程序,并学习如何调试它。

第2章:类型 本章将探索C++类型系统。你将了解基本类型,这是所有其他类型的基础。你也将了解普通数据类和全功能类。你还将深入了解构造函数、初始化和析构函数的作用。

第3章:引用类型 本章介绍存储其他对象的内存地址的对象。这种类型是许多重要的编程模式的基石,它能够产生灵活、高效的代码。

第4章:对象生命周期 本章在存储期的背景下继续讨论类的不变量和构造函数。同时,本章将探讨析构函数与资源获取即初始化(Resource Acquisition Is Initialization,RAII)范式。你将了解异常机制,以及它如何保证类的不变量、如何完善RAII。在了解了移动和复制语义后,你将探索如何用构造函数和赋值运算符来操作它们。

第5章:运行时多态 本章介绍接口,接口是一个允许你编写运行时的多态代码的编程概念。你将学习继承和对象组合的基础知识,这是在C++中使用接口的基础。

第6章:编译时多态 本章介绍模板,这也是一种允许你编写多态代码的语言特性。你还将探索将被添加到未来C++版本中的一个语言特性concept,以及允许你将对象从一种类型转换为另一种类型的类型转换函数。

第7章:表达式 你将深入研究操作数和运算符。在牢牢掌握类型、对象生命周期和模板之后,你将进入C++语言核心部分的学习,而表达式便是切入点。

第8章:语句 本章探讨组成函数的元素。你将学习表达式语句、复合语句、声明语句、迭代语句和跳转语句。

第9章:函数 本章讨论如何将语句变成工作单元。你将学习函数定义、返回类型、重载解析、可变参数函数、可变参数模板和函数指针等。你还将学习使用函数调用运算符和lambda表达式创建可调用的用户自定义类型的方法。你将探索std::function——一个存储可调用对象的容器类。

第二部分 C++库和框架

第10章:测试 本章介绍单元测试和模拟框架。你将练习测试驱动开发,为自动驾驶系统开发软件,同时学习一些框架,如Boost Test、Google Test、Google Mock等。

第11章:智能指针 本章介绍标准库为处理动态对象的所有权提供的特殊实用类。

第12章:工具库 本章介绍标准库和Boost库中用于处理常见编程问题的类型、类和函数。你将了解数据结构、数值函数和随机数生成器。

第13章:容器 本章介绍Boost库和标准库中的许多特殊数据结构,它们可以帮助你组织数据。你将了解顺序容器、关联容器和无序关联容器。

第14章:迭代器 迭代器是容器和字符串之间的接口。本章介绍不同类型的迭代器以及如何设计它们以便更灵活地编写程序。

第15章:字符串 本章介绍如何在单一容器中处理人类语言数据。你将了解内置于字符串中的特殊设施(facility),这些设施可以让你执行一些简单的任务。

第16章:流 本章介绍支撑输入和输出操作的主要概念。你将学习如何用格式化和非格式化的操作处理输入与输出流,以及如何使用操纵符。你还将学习如何从文件中读取数据以及如何向文件写入数据。

第17章:文件系统 本章介绍标准库中用于操作文件系统的工具。你将学习如何构建和操作路径,如何检查文件和目录,以及如何枚举目录结构。

第18章:算法 本章介绍标准库中可以轻松解决的几十个问题。你将了解这些高质量算法令人惊讶的适用范围。

第19章:并发和并行 本章介绍一些简单的多线程编程方法,这些方法是标准库的一部分。你将了解future、互斥量、条件变量和原子类型。

第20章:用Boost Asio进行网络编程 本章介绍如何构建通过网络进行通信的高性能程序。你将了解如何使用Boost Asio的阻塞式和非阻塞式输入与输出。

第21章:编写应用程序 这是本书的收尾部分,讨论了几个重要的主题。你将了解程序支持设施,这些设施可以帮助你构建更加完整的应用程序。你还将了解Boost ProgramOptions,这个库可以让你直接编写接受用户输入的控制台应用程序。

注意 请访问配套网站https://ccc.codes/获得本书中的代码。

致谢

首先,感谢我的家人给我创作空间,我花了两倍的时间才写出我计划的一半内容,感谢他们的耐心陪伴,我欠他们的无法估量。

感谢Kyle Willmon和Aaron Bray,是他们教会了我C++;感谢Tyler Ortman,是他把这本书从提案中“孕育”了出来;感谢Bill Pollock,是他润色了本书;感谢Chris Cleveland、Patrick De Justo、Anne Marie Walker、Annie Choi、Meg Sneeringer和Riley Hoffman,是他们一流的编辑能力让本书变得更好;感谢早期的读者,是他们提供了不可估量的反馈。

最后,感谢Jeff Lospinoso,他把那本翻过很多遍、沾满咖啡的“骆驼书”[1]送给了他那年仅10岁的侄子,帮他点燃了编程的火花。


[1] “骆驼书”指《Perl编程语言》,O’Reilly出版。——译者注