一共19章,以C++20为标准,讲述了最新的现代C++所提供的编程特性。
有其他语言编程经验的读者可以从本书中快速了解C++所具备的功能,从而获得对现代C++的更全面认知,以便更好地了解现代C++语言已经发展到的程度。资深程序员可以从本书作者的整体行文风格中感受到他在设计C++特性时的一些考量及侧重点,了解C++这门语言在历史上曾经历过的变迁,以及一部分特性为什么会是今天这个样子。
《C++之旅(第3版)(英文版)》适合的读者:有其他语言编程经验,想要了解C++语言的读者;有传统C++编程经验,想要了解现代C++语言特性的读者;有较丰富编程经验且想了解C++之父在C++设计过程中的一些设计细节与思路的读者。
C++之父扛鼎之作、全面接纳C++20/23新版、带领卓越程序员参透设计哲学照见语言未来
前言
在你进行指示时,简短些!
——西塞罗
现代C++给人感觉像一种新的语言。我是说,相比C++98或C++11的时代,现在我能够更清晰、更简单、更直接地表达我的想法。不但如此,现代C++生成的程序也更容易被编译器检查,而且运行得更快。
本书展示了C++20定义的C++的概况,它是当前ISO C++的标准,并且已被主流C++提供商实现。另外,本书还提到了一些目前已使用的库组件,但它们还没被纳入C++23标准的计划。
就像其他的现代编程语言一样,C++也很“大”,因为它需要大量的库来提高自身的效率。这本薄薄的书旨在让有经验的程序员了解现代C++是由什么构成的,它涵盖了主要的语言特性和主要的标准库组件。本书可以在一两天内读完,但要写出好的C++代码,显然需要比读本书多得多的学习时间。然而本书的目标不是让你精通语言,而是提供概述与关键示例来帮助你着手学习。
你最好已经有一些编程经验。如果不是这样,请考虑先阅读相关的资料再继续阅读本书,推荐的资料有《C++程序设计原理与实践》(第2版)[Stroustrup, 2014]。即使你以前编写过程序,使用的语言及写过的程序与这里介绍的C++风格也可能存在非常大的区别。
想象一下,在哥本哈根或者纽约等城市观光旅游。在短短几小时内,你快速地浏览了当地主要景点,聆听了一些背景故事,并获得了一些下一步该做什么的建议。但你并不能在这样简短的旅程中完全理解这座城市,也不能完全理解所见所闻,有些故事听起来可能很奇特,甚至不可思议。你也不知道如何驾驭管理城市生活的规则,不管是正式的还是非正式的。要想真正理解一座城市,你必须在这个城市住上几年。然而,如果足够幸运的话,你可能会了解一些概况,对这个城市的特殊之处形成概念,并且对其中的一部分产生兴趣。在这次旅行结束之时,真正的探索才刚刚开始。
《C++之旅》介绍了C++语言的主要特性,它们都支持面向对象和泛型编程之类的编程风格。不要指望本书会像参考手册那样,逐个特性地详细介绍语言的全貌。在这本最经典的教科书中,我试图在使用一个特性之前对它做出解释的,但其实很难完全做到这样,因为并不是每个人都严格按章节顺序阅读。我认为本书的读者在技术上已经非常成熟。因此,读者不妨对交叉引用善加利用。
同样,《C++之旅》对标准库的介绍以示例的形式点到为止,不会详尽描述所有细节。读者应根据需要搜索额外的资料来获取技术支持。C++生态系统涵盖的范围远超ISO标准提供的配套工具(例如,库、构建系统、分析工具和开发环境),读者可在网上获得海量(但良莠不齐)的资料。大多数读者可以从CppCon和Meeting C++等会议中发现有用的教程和简要介绍的视频。如果读者想要了解有关语言的技术细节和 ISO C++标准提供的库,我推荐Cppreference网站。例如,当遇到一个标准库函数或类时,很容易就能在该网站查到它的定义,而且通过查阅它的文档,可以找到许多相关联的工具。
《C++之旅》呈现出来的C++是一个集成的整体,而不是整齐地堆叠在一起的层状蛋糕。因此,具体的语言特性究竟是来自C、C++98,还是来自更高版本的ISO标准,我极少做出标注。此类信息可在第19章中找到。我专注于基础知识并尽量保证内容简明扼要,但我并没有完全抵制住过度呈现新特性的诱惑,模块(3.2.2节)、概念(8.2节)和协程(18.6节)这三节就是“例证”。我对最新进展的稍许偏爱,似乎也正好满足许多已经了解某些旧版本C++知识的读者的好奇心。
编程语言参考手册或标准只是简单地说明了可以做什么,但程序员通常更感兴趣的是学习如何更好地使用该语言。鉴于此,本书所涵盖的主题是精心挑选的,在文字内容上也有所体现,尤其是在建议性章节。关于现代C++如此优秀的原因,可以在C++ Core Guidelines [Stroustrup, 2015]中找到更多观点。如果想进一步探索本书提出的理念,可以将C++ Core Guidelines视为一个很好的参考来源。你可能会注意到,C++ Core Guidelines 和本书在建议的提法及建议的编号上有着惊人的相似之处,其原因之一是,《C++之旅》的第1版正是C++ Core Guidelines初版内容的主要来源。
鸣谢
感谢所有帮助完成和更正《C++之旅》早期版本的人,特别是在哥伦比亚大学参加我的“Design Using C++”课程的学生。感谢摩根士丹利给我时间编写本书。感谢Chuck Allison、Guy Davidson、Stephen Dewhurst、Kate Gregory、Danny Kalev、Gor Nishanov和J.C. van Winkel审阅本书,并提出了许多改进建议。
我使用troff完成本书的排版,并使用了Brain Kernighan原创的宏。
本贾尼·斯特劳斯特鲁普
于纽约曼哈顿