在编程语言的浩瀚星空中,C++无疑是一颗璀璨夺目的巨星。它以强大的性能、灵活的抽象能力,成为操作系统、游戏引擎、金融交易系统等性能关键领域的基石。而提及C++,就不得不说到它的缔造者------Bjarne Stroustrup,这位被誉为"C++之父"的技术大师,用智慧与匠心为全球开发者打造了一座编程语言的丰碑。如今,由他亲自主导的《C++程序设计语言(第4版)》重译版正式出版,恰似一场及时雨,为国内开发者带来了一场技术盛宴,而此前他的中国行,更是为这场盛宴提前点燃了热情的火焰。
在上海的"全球C++及系统软件技术大会"上,Bjarne与国内顶尖技术专家围坐一堂,展开了一场激烈的圆桌讨论。他的观点引发了全场共鸣,开发者们深刻认识到,在技术飞速发展的今天,不断提升自身能力才是立足之本。
重译版:经典传承,焕新升级
如果说Bjarne的中国行是一场技术与思想的盛宴,那么《C++程序设计语言(第4版)》重译版的出版,则是这场盛宴的核心佳肴。这部著作自1985年首版问世以来,历经四次重大更新,始终与C++语言的演进同频共振,被誉为全球C++开发者的"圣经"。

《C++程序设计语言》是 C++之父 Bjarne Stroustrup 的经典之作,本书(第 4 版)不仅继续传承了经典的 C++ 编程理念,也深入阐释了 C++11 对编程范式的深远影响。
C++11 的推出,标志着 C++语言从传统的系统编程语言转向现代高效、安全、灵活的多范式编程语言。 许多革命性的特性被引入,如智能指针、auto 关键字、lambda 表达式、constexpr、范围 for 循环、线程库等, 这些特性改变了 C++的编程风格,使得程序员可以编写出更加简洁、高效、易于维护的代码。更重要的是, C++11 为后续的语言标准设定了发展方向,推动了 C++在全新编程需求下的不断演化。
《C++程序设计语言》的各版本也是这一重要历史阶段的见证者与推动者。本书通过全面而系统的介绍, 帮助开发者掌握 C++语言的核心思想与设计理念,并深入理解 C++11 的每一个新特性。对于全球数百万 C++ 开发者来说,本书无疑是连接传统 C++与现代 C++的桥梁。Stroustrup 博士不仅是 C++语言的创始人,更是 其发展历程中的领航者。他对 C++的设计哲学与技术创新的深刻理解贯穿本书的每一页,使其成为现代 C++ 开发者不可或缺的宝典。
本书面向三类读者:
• 想知道最新的 ISO C++标准都提供了哪些新特性的C++程序员;
• 好奇 C++到底提供了哪些超越 C 语言特性的C 程序员;
• 具备 Java 、C# 、Python 和 Ruby 等编程语言背景,正在探寻"更接近机器"的语言,即更灵活、提供 更好的编译时检查或是更好性能的语言的程序员。
自然,这三类读者可能是有交集的------一个专业软件开发者通常掌握多门编程语言。
本书结构
纯粹的教程通常会按部就班地展开内容,所有概念都会先介绍再应用,因此必须从第一页开始顺序阅读。 反之,纯粹的参考手册则可以随意查阅,因为每个主题的描述都简明扼要,辅以指向相关主题的前向或后向 引用。阅读纯粹的教程原则上不需要任何预备知识, 因为教程会展开描述所有内容。而纯粹的参考手册则只 适用于已经熟悉所有基本概念和技术的人。本书兼具这两类书的特点。如果你已经了解了大多数概念和技术, 就可以仅仅按需阅读特定章甚至特定节。如果你还没有基础, 则可以从头阅读,但注意不要陷入细节中无法 自拔。请善用索引和交叉引用。
一本书的各部分若要形成一定程度的自包含,就意味着不免会有一些重复性内容,而这些重复性内容也 利于顺序阅读的读者进行复习。本书包含大量的交叉引用,引用范围不仅囊括了本书内容,还包括 ISO C++ 标准库。有经验的程序员则可以通过阅读(相对)简短的 C++"概览"来了解本书概貌,并将本书用作参考 手册。本书包含以下 4 篇。
第 1 篇 第 1~5 章。第 1 章(即本章)是全书的导引,会介绍一些 C++的背景知识。第 2~5 章对 C++ 及其标准库进行简要介绍。
第 2 篇 第 6~15 章。介绍 C++的内置类型和基本特性,以及如何用它们构造程序。
第 3 篇 第 16~29 章。介绍 C++的抽象机制,以及如何利用这些机制编写面向对象程序和泛型程序。
第 4 篇 第 30~44 章。对标准库进行全面概述,并讨论一些兼容性问题。
本书内容
1 导言

第 2 章 C++之旅:基础知识。介绍 C++的内存模型、计算模型和错误处理模型。
第 3 章 C+
+之旅:抽象机制。介绍用来支持数据抽象、面向对象编程和泛型编程的C++语言特性。
第 4 章 C++之旅:容器和算法。介绍由标准库提供的字符串、简单 I/O、容器和算法等特性。
第 5 章 C++之旅:并发与实用工具。概述资源管理、并发处理、数学计算、正则表达式以及更多由标
准库提供的工具。
以上提到的几章对 C++基本特性进行了短平快式的概览,目的是让读者初步领略 C++提供了哪些功能。 特别是让读者看到自本书第 1 版出版以来,经过第 2 版、第 3 版直到第 4 版,C++取得了哪些长足进步。
2 基本特性

第 2 篇重点关注支持传统的C 风格及类似语言风格的C++子集,包括类型、对象、作用域和存储的概念; 演示了计算的基础, 即表达式、语句和函数;讨论了命名空间、源文件和异常处理等, 它们用来支持模块 化编程。
第 6 章 类型和声明。介绍基本类型、名称、作用域、 初始化、简单类型推断、对象生命周期和类型别名。
第 7 章 指针、数组与引用。
第 8 章 结构体、联合体与枚举。
第 9 章 语句。介绍声明作为语句、选择语句(if 语句和switch 语句)、迭代语句(for 语句、while 语句和 do 语句)、goto 语句和注释语句。
第 10 章 表达式。介绍桌面计算器示例、运算符、常量表达式和隐式类型转换。
第 11 章 选择操作。介绍逻辑运算符、条件表达式、递增与递减、自由存储区(new 和 delete)、列表、 lambda 表达式和显式类型转换(static_cast 和 const_cast)。
第 12 章 函数。介绍函数声明和定义、 inline 函数、constexpr 函数、参数传递、重载函数、前置与后置 条件、函数指针和宏。
第 13 章 异常处理。介绍错误处理、异常保证、资源管理、强制不变式、抛出和捕获异常, 以及 vector 的实现。
第 14 章 命名空间。介绍命名空间、模块化与接口、使用命名空间组合代码等。
第 15 章 源文件与程序。介绍单独编译、链接、使用头文件及程序的启动和结束。
我假定读者熟悉第 1 篇中用到的大多数编程概念。例如, 我会解释用以表达递归和循环的 C++特性,但 我不会深入讨论技术细节或者花很多篇幅解释递归和循环这些概念如何有用。
这里的例外是异常处理1。很多程序员缺乏异常处理的经验,或者仅有来自资源管理和异常处理机制不全的 语言(如 Java)的使用经验。因此, 异常处理这一章(即第 13 章)会介绍 C++异常处理和资源管理的基本理念, 并深入讨论一些技术细节,重点介绍"资源获取即初始化"(Resource Acquisition Is Initialization,RAII)技术。
3 抽象机制


第 3 篇介绍用以支持各种抽象形式的 C++特性,包括面向对象编程和泛型编程。其中各章的主题可以粗 略分为 3 类:类、类继承和模板。
第 16~19 章集中讨论了类本身。
第 16 章 类。介绍用户自定义类型,即类的概念,类是所有 C++抽象机制的基础。
第 17 章 构造、清理、复制和移动。展示如何自定义类对象创建和初始化操作的含义。此外,复制、 移动和析构的含义同样可以自定义。
第 18 章 运算符重载。介绍为用户自定义类型指定运算符含义的规则,重点介绍常用的算术运算符和 逻辑运算符,例如+ 、*和&等。
第 19 章 特殊运算符。讨论用户自定义的非算术运算符的使用,例如用于下标的[]、用于函数对象的() 和用于"智能指针"的->。类可以层次化地组织。
第 20 章 派生类。介绍构建类层次的 C++基本特性及其基本使用方法。我们可以实现接口(抽象类) 与其实现(派生类)的完全分离,两者间的联系通过虚函数提供。该章还介绍了 C++的访问控制机制(public protected 和 private)。
第 21 章 类层次结构。讨论高效使用类层次的方法。该章还介绍了多重继承的概念,即某个类有多个直接基类。
第 22 章 运行时类型信息。介绍如何使用存储在对象中的数据实现类层次间的导航。可以用dynamic_cast 查询某个基类对象是不是作为某个派生类对象定义的,还可以用 typeid 获得一个对象的最基本信息(例如它 的类名)。
最灵活、最高效、最有用的抽象中的很多都采用其他类型(类)和算法(函数)来对某类型和算法进行 参数化。
第 23 章 模板。介绍模板及其使用方法的底层原理,还介绍了类模板、函数模板和模板别名。
第 24 章 泛型编程。介绍泛型编程的基本技术,核心在于从具体代码示例出发,提升至抽象算法的技 术,并通过概念指定泛型算法对其实参的要求。
第 25 章 特化。介绍特化技术,即如何利用给定的一组模板实参从模板生成类和函数。
第 26 章 实例化。重点关注名称绑定的相关规则。
第 27 章 模板和层次结构。解释模板层次和类层次如何组合使用。
第 28 章 元编程。探索如何利用模板生成程序。模板提供了一种图灵完备的代码生成机制。
第 29 章 矩阵设计。给出一个稍具规模的例子,展示怎样综合运用我们已经学到的 C++语言特性来解 决复杂的设计问题:设计出几乎支持任意元素类型的 N维矩阵。
支持抽象的 C++语言特性都是围绕着相关技术的语境引入的。第 3 篇与第 2 篇的不同之处在于,其中不 再假定读者已经了解相关技术。
4 标准库


介绍标准库的章节比前面介绍 C++语言特性的章节"教学味"更少。可以按照任意顺序阅读本篇, 也可 以将本篇用作标准库组件的用户手册。
第 30 章 标准库概览。对标准库进行概览,列出了标准库头文件,并介绍了语言特性支持和程序诊断 支持,如 exception 和 system_error 等。
第 31 章 STL 容器。介绍迭代器, 以及容器和算法框架(称为标准模板库,STL)中的容器,如 vector、 map 和 unordered_set 等。
第 32 章 STL 算法。介绍 STL 中的算法,如 find() 、sort()和 merge()等。
第 33 章 STL 迭代器。介绍 STL 中的迭代器和其他工具,如reverse_iterator、move_iterator 和 function 等。
第 34 章 内存和资源。介绍与内存和资源管理相关的工具组件,如 array、bitset、pair、tuple、unique_ptr、 shared_ptr、分配器和垃圾收集接口等。
第 35 章 工具。介绍较次要的工具组件,如时间工具、类型特征以及各种类型函数等。 第 36 章 字符串。介绍标准库 string,包括作为不同字符集基础的字符特征。
第 37 章 正则表达式。介绍正则表达式的语法和使用它进行字符串匹配的不同方法,包括用regex_match() 匹配一个完整的字符串,用 regex_search()在一个字符串中查找一个模式,用 regex_replace()进行简单替换, 以及用 regex_iterator 对一个字符流进行遍历等。
第 38 章 I/O 流。介绍标准库 I/O 流,包括格式化和非格式化输入输出、错误处理以及缓冲等。
第 39 章 区域设置。介绍类 locale 及其各种 facet,这些 facet 提供了对区域设置功能的支持,包括处理 字符集中的文化差异、格式化数值、格式化日期和时间等。
第 40 章 数值。介绍用于数值计算的标准库工具,如 complex 、valarray、随机数和通用数值算法等。 第 41 章 并发。介绍 C++基本内存模型和支持无锁并发编程的工具。
第 42 章 线程和任务。介绍支持"线程和锁风格"并发编程的类,如 thread 、timed_mutex 、lock_guard 和 try_lock()等,以及支持基于任务的并发编程的类,如 future 和 async()等。
第 43 章 C 标准库。介绍已纳入 C++标准库的 C 标准库特性,如 printf()和 clock()等。
第 44 章 兼容性。讨论 C 和C++的关系,以及标准 C++(也称为 ISO C++)与早期 C++的关系。
5 示例和参考文献
本书的重点在于介绍程序组织而非算法设计。因此, 我有意避开了那些巧妙的或难以理解的算法。平凡 的算法通常更适合用以展示语言定义的某个方面或是程序结构中的某个点。例如, 我可能选用希尔排序作为 示例,但在实际代码中采用快速排序可能更好。换用更适合的算法把程序重新实现一遍,通常是不错的练习。