导览

C++ 导览

作者:Bjarne Stroustrup

C++11 感觉像一门新语言。我现在编写代码的方式与 C++98 不同。C++11 代码比我过去编写的代码更短、更简单,通常也更高效。

这带来了挑战:你如何介绍 C++?你推荐什么技术?你强调哪些语言特性和库?将 C++11 作为 C++98 的一层来呈现,就像将 C++98 作为 C 的一层来呈现一样糟糕。C++ 必须作为一个整体来呈现,作为一个强大的设计和实现工具,而不是一组独立的特性。

《C++ 编程语言》第四版正尝试这样做,并应在几个月内上市。为了帮助人们开始使用 C++11 和 TC++PL4,我在四个章节中总结了 C++11,统称为《C++ 导览》。Addison-Wesley 慷慨地允许我发布这些章节的草稿。我将在接下来的几个月里这样做。

TC++PL4 不是科幻作品。所有呈现的功能都可在一个或多个当前发行的 C++ 编译器中使用。所有 C++ 编译器供应商都在努力完成他们的 C++11 支持。

“导览”是对 ISO 标准 C++ 的导览,而不是对 C++11 中的新功能或你最喜欢的 C++ 实现的导览。此外,导览假定对编程有一些熟悉;它不是为完全的初学者编写的。

非常欢迎建设性的反馈。

- Bjarne Stroustrup(2012 年 11 月)

附:有关 C++11 新功能的列表,请参阅我的 C++11 常见问题。当然,TC++PL4 中有这样的列表,但它不属于导览的一部分。

 

tour.PNG开始导览

导览现在也以书籍形式提供;请参阅右侧的封面图片。

 

《C++ 编程语言》第四版序言

[2013 年 3 月补充:上面提到的 Stroustrup 的 TC++PL4e 序言现已提供,并经许可在此转载。]

 

计算机科学中的所有问题都可以通过另一个间接层来解决,除了间接层过多本身的问题。

            — David J. Wheeler

 

C++ 感觉像一门新语言。也就是说,我可以用 C++11 比用 C++98 更清晰、更简单、更直接地表达我的想法。此外,生成的程序经过编译器更好的检查,运行速度更快。

在这本书中,我力求完整。我描述了专业程序员可能需要的每一个语言特性和标准库组件。对于每一个,我提供了

  • 原理:它旨在帮助解决什么样的问题?设计背后的原则是什么?基本限制是什么?
  • 规范:它的定义是什么?细节级别是为专家程序员选择的;有抱负的语言律师可以遵循对 ISO 标准的许多引用。
  • 示例:它如何单独使用以及与其他功能结合使用?关键的技术和习惯用法是什么?对可维护性和性能有何影响?

C++ 的使用多年来发生了巨大变化,语言本身也发生了变化。从程序员的角度来看,大部分变化都是改进。当前的 ISO 标准 C++ (ISO/IEC 14882:2011,通常称为 C++11) 简直是编写高质量软件的更好工具,胜过以前的版本。它如何成为更好的工具?现代 C++ 支持什么样的编程风格和技术?哪些语言和标准库功能支持这些技术?优雅、正确、可维护和高效的 C++ 代码的基本构建块是什么?这些是本书回答的关键问题。许多答案与 1985 年、1995 年或 2005 年的 C++ 所能找到的答案不同:进步正在发生。

C++ 是一种通用编程语言,强调设计和使用类型丰富、轻量级的抽象。它特别适用于资源受限的应用程序,例如软件基础设施中发现的那些。C++ 奖励那些花时间掌握编写高质量代码技术的程序员。C++ 是一门为认真对待编程任务的人准备的语言。我们的文明严重依赖软件;它最好是高质量的软件。

已部署了数十亿行的 C++ 代码。这使得稳定性变得至关重要,因此 1985 年和 1995 年的 C++ 代码仍然有效,并将继续有效数十年。然而,对于所有应用程序,您可以使用现代 C++ 做得更好;如果您坚持旧的风格,您将编写质量更低、性能更差的代码。对稳定性的强调也意味着您今天编写的符合标准的代码在几十年后仍然有效。本书中的所有代码都符合 2011 年 ISO C++ 标准。

本书面向三类读者

  • 希望了解最新 ISO C++ 标准提供哪些功能的 C++ 程序员,
  • 想知道 C++ 除了 C 之外还提供了哪些功能的 C 程序员,以及
  • 具有 Java、C#、Python 和 Ruby 等应用程序语言背景的人,正在寻找“更接近机器”的东西——更灵活、提供更好的编译时检查或提供更好性能的东西。

当然,这三类群体并非互不相干——专业的软件开发人员掌握的不仅仅是一种编程语言。

本书假定其读者是程序员。如果你问“什么是 for 循环?”或“什么是编译器?”,那么这本书不适合你(暂时);相反,我推荐我的《编程:使用 C++ 的原理与实践》来开始学习编程和 C++。此外,我假设读者作为软件开发人员具有一定的成熟度。如果你问“为什么要费心测试?”或说“所有语言基本都一样;只给我语法即可”或确信有一种语言是适合所有任务的理想语言,那么这本书不适合你。

C++11 比 C++98 提供了哪些功能?一个适合现代具有大量并发的计算机的机器模型。用于系统级并发编程(例如,使用多核)的语言和标准库设施。正则表达式处理、资源管理指针、随机数、改进的容器(包括哈希表)等等。通用且统一的初始化、更简单的 for 语句、移动语义、基本 Unicode 支持、lambda 表达式、通用常量表达式、类默认控制、变参模板、用户定义字面量等等。请记住,这些库和语言功能的存在是为了支持开发高质量软件的编程技术。它们旨在组合使用——作为建筑套件中的砖块——而不是单独使用以解决特定问题。计算机是一台通用机器,C++ 以这种能力为它服务。特别是,C++ 的设计目标是足够灵活和通用,以应对其设计者未曾梦想到的未来问题。

致谢

除了前几版致谢部分中提到的人员,我还要感谢 Pete Becker、Hans-J. Boehm、Marshall Clow、Jonathan Coe、Lawrence Crowl、Walter Daugherty、J. Daniel Garcia、Robert Harle、Greg Hickman、Howard Hinnant、Brian Kernighan、Daniel Krügler、Nevin Liber、Michel Michaud、Gary Powell、Jan Christiaan van Winkel 和 Leor Zolman。没有他们的帮助,这本书会逊色很多。

感谢 Howard Hinnant 回答了许多关于标准库的问题。

Andrew Sutton 是 Origin 库的作者,该库是模板章节中模拟概念的大部分讨论的试验台,也是第 29 章主题的矩阵库的作者。Origin 库是开源的,可以通过在网上搜索“Origin”和“Andrew Sutton”找到。

感谢我的研究生设计课,他们比任何人都发现了“导览章节”中的更多问题。

如果我能采纳所有审稿人的建议,这本书无疑会大大改进,但它也会增加数百页。每位专家审稿人都建议添加技术细节、高级示例和许多有用的开发约定;每位新手审稿人(或教育者)都建议添加示例;大多数审稿人都指出(正确地)这本书可能太长了。

感谢普林斯顿大学计算机科学系,特别是 Brian Kernighan 教授,在我休假期间为我提供了一个写作本书的场所。

感谢剑桥大学计算机实验室,特别是 Andy Hopper 教授,在我休假期间为我提供了一个写作本书的场所。