4235

这个问题试图收集每年出版的几十本糟糕的 C++ 书籍中的几颗珍珠。

与许多其他经常从 Internet 上找到的教程在旅途中学习的编程语言不同,很少有人能够在不学习写得很好的 C++ 书籍的情况下快速学习 C++。这样做太大太复杂了。事实上,它是如此庞大和复杂,以至于有很多非常糟糕的 C++ 书籍。而且我们不是在谈论糟糕的风格,而是在谈论明显的事实错误推广极其糟糕的编程风格

请编辑接受的答案以提供高质量的书籍和大致的技能水平 -最好 C++ 聊天室讨论您的添加之后。(如果他们不同意推荐,常客可能会无情地撤销您的工作。)为您亲自阅读/受益的每本书添加简短的宣传/描述。随意讨论质量、标题等。符合标准的书籍将被添加到列表中。有 C 和 C++ 用户协会 (ACCU) 评论的书籍有评论链接。

*注意:常见问题和其他资源可以在C++ 标签信息下找到。

4

1 回答 1

5542

初学者

入门级,无编程经验

作者 描述 审查
C++ Primer *

* 不要与C++ Primer Plus (Stephen Prata) 混淆,评论明显不太好。
Stanley Lippman、Josée Lajoie 和 Barbara E. Moo(针对 C++11 更新 这本书有 1k 页,是对 C++ 的非常全面的介绍,它以一种非常易于理解的格式和非常详细的方式涵盖了该语言中的几乎所有内容。第五版(2012 年 8 月 16 日发布)涵盖了 C++11。 [审查]
编程:使用 C++ 的原理与实践 Bjarne Stroustrup,第 2 版 - 2014 年 5 月 25 日(针对 C++11/C++14 更新 由语言的创建者介绍使用 C++ 进行编程。一本好书,假设没有以前的编程经验,但不仅适用于初学者。

入门,有以前的编程经验

作者 描述 审查
C++ 之旅 Bjarne Stroustrup(C++17 第 2 版 “教程”是对所有标准 C++(语言和标准库,以及使用 C++11 )的快速(大约 180 页和 14 章)教程概述,对于已经了解 C++ 或至少了解 C++ 的人来说,水平适中经验丰富的程序员。本书是构成《C++ 编程语言》第 4 版第 2-5 章材料的扩展版本。
加速 C++ Andrew Koenig 和 Barbara Moo,第 1 版 - 2000 年 8 月 24 日 这基本上涵盖了与C++ Primer相同的基础,但只占用了四分之一的空间。这主要是因为它并不试图成为对编程的介绍,而是为以前用其他语言编程过的人介绍C++ 。它有一个更陡峭的学习曲线,但是,对于那些能够应付这一点的人来说,这是一个非常紧凑的语言介绍。(从历史上看,它是第一本使用现代方法教授语言的初学者书籍,从而开辟了新天地。)尽管如此,它所教授的 C++ 纯粹是 C++98。 [审查]

最佳实践

作者 描述 审查
有效的 C++ Scott Meyers,第 3 版 - 2005 年 5 月 22 日 这本书的目的是成为 C++ 程序员应该阅读的最好的第二本书,它成功了。早期版本针对来自 C 的程序员,第三版改变了这一点,并针对来自 Java 等语言的程序员。它以一种非常容易理解(且令人愉快)的方式展示了大约 50 条易于记忆的经验法则及其基本原理。对于 C++11 和 C++14,示例和一些问题已经过时,应该首选有效的现代 C++。 [审查]
有效的现代 C++ 斯科特迈耶斯 本书面向从 C++03 过渡到 C++11 和 C++14 的 C++ 程序员。这本书可以看作是对前一本书《Effective C++》某些部分的延续和“修正”。它们不涵盖相同的内容,但保持类似的基于项目的主题。
有效的 STL 斯科特迈耶斯 这旨在对来自 STL 的标准库的部分做同样的事情,就像Effective C++对整个语言所做的那样:它提出了经验法则及其基本原理。 [审查]

中间的

作者 描述 审查
更有效的 C++ 斯科特迈耶斯 比有效 C++更多的经验法则。不如第一本书中的重要,但仍然很高兴知道。
卓越的 C++ 赫伯萨特 作为一组谜题,除了深入涵盖包括 pimpl 在内的各种其他主题外,它还通过资源获取即初始化 (RAII) 对 C++ 中的适当资源管理和异常安全进行了最佳和彻底的讨论之一成语、名称查找、良好的类设计和 C++ 内存模型。 [审查]
更出色的 C++ 赫伯萨特 除了讨论 C++ 中有效的面向对象编程和正确使用 STL 之外,还涵盖了Exceptional C++中未涵盖的其他异常安全主题。 [审查]
卓越的 C++ 风格 赫伯萨特 讨论通用编程、优化和资源管理;这本书还很好地阐述了如何使用非成员函数和单一职责原则在 C++ 中编写模块化代码。 [审查]
C++ 编码标准 Herb Sutter 和 Andrei Alexandrescu 这里的“编码标准”并不意味着“我的代码应该缩进多少个空格?” 本书包含 101 个最佳实践、习语和常见陷阱,可帮助您编写正确、可理解和高效的 C++ 代码。 [审查]
C++ 模板:完整指南 David Vandevoorde 和 Nicolai M. Josuttis 这是本关于 C++11 之前存在的模板的书。它涵盖了从非常基础到一些最先进的模板元编程的所有内容,并解释了模板如何工作的每一个细节(包括概念上的以及它们是如何实现的),并讨论了许多常见的陷阱。附录中对单一定义规则 (ODR) 和重载解决方案进行了出色的总结。涵盖 C++11、C++14 和 C++17的第二版已经出版。 [审查]
C++ 17 - 完整指南 Nicolai M. Josuttis 本书描述了 C++17 标准中引入的所有新特性,涵盖了从简单的“内联变量”、“constexpr if”等简单特性一直到“多态内存资源”和“使用过度对齐数据的新建和删除”的所有内容'。 [审查]
C++ 20 - 完整指南 Nicolai M. Josuttis 本书介绍了 C++20 的所有新语言和库特性。它通过示例和背景信息涵盖了每个新功能的动机和背景。重点是这些特性如何影响日常编程,将它们结合起来意味着什么,以及如何在实践中从 C++20 中受益。(请注意,本书是逐步出版的。)
C++ 在行动 巴托什·米列夫斯基 本书通过从头开始构建应用程序来解释 C++ 及其特性。 [审查]
C++ 中的函数式编程 伊万·丘基奇 本书介绍了现代 C++(C++11 及更高版本)的函数式编程技术。对于那些想要将函数式编程范式应用于 C++ 的人来说,这是一本非常好的读物。

先进的

作者 描述 审查
现代 C++ 设计 安德烈·亚历山德雷斯库 一本关于高级通用编程技术的开创性书籍。介绍基于策略的设计、类型列表和基本的泛型编程习惯用法,然后解释有多少有用的设计模式(包括小对象分配器、函子、工厂、访问者和多方法)可以使用泛型编程高效、模块化和干净地实现. [审查]
C++ 模板元编程 David Abrahams 和 Aleksey Gurtovoy
C++ 并发实战 安东尼·威廉姆斯 一本涵盖 C++11 并发支持的书,包括线程库、原子库、C++ 内存模型、锁和互斥锁,以及设计和调试多线程应用程序的问题。涵盖 C++14 和 C++17的第二版已经出版。 [审查]
高级 C++ 元编程 戴维德·迪·热纳罗 一份 C++11 之前的 TMP 技术手册,更侧重于实践而非理论。本书中有大量片段,其中一些因类型特征而过时,但了解这些技术仍然很有用。如果你能忍受古怪的格式/编辑,它比 Alexandrescu 更容易阅读,而且可以说更有价值。对于更有经验的开发人员,您很有可能会发现一些关于 C++ 黑暗角落的东西(一个怪癖),而这通常只能通过丰富的经验来实现。
大规模 C++ 第 I 卷,过程和架构(2020) 约翰·拉科斯 扩展旧书“大规模 C++ 设计”的三部分系列的第一部分。Lakos 解释了管理大型 C++ 软件项目的久经考验的技术。如果您在一个大型 C++ 软件项目中工作,这是一本很好的读物,详细介绍了物理和逻辑结构之间的关系、组件的策略以及它们的重用。 [审查]

参考风格 - 所有级别

作者 描述 审查
C++ 编程语言 Bjarne Stroustrup(针对 C++11 更新 其创建者对 C++ 的经典介绍。与经典的 K&R 并行编写,这确实读起来非常喜欢,涵盖了从核心语言到标准库、编程范式到语言哲学的几乎所有内容。 [评论]注意:C++ 标准的所有版本都在问题“ 我在哪里可以找到当前的 C 或 C++ 标准文档?
”中进行跟踪。
C++ 标准库教程和参考 Nicolai Josuttis(针对 C++11 更新 C++标准库的介绍和参考。第二版(2012 年 4 月 9 日发布)涵盖了 C++11。 [审查]
C++ IO 流和语言环境 安吉丽卡·兰格和克劳斯·克雷夫特 除了如果您想了解有关流和语言环境的任何信息,这本书几乎没有什么可说的,那么这里就是找到明确答案的地方。 [审查]

C++11/14/17/… 参考资料:

  • C++ 11 / 14 / 17标准 (INCITS/ISO/IEC 14882:2011/2014/2017)当然,这是所有 C++ 的最终仲裁者。但是请注意,它仅供愿意花费大量时间和精力来理解它的有经验的用户的参考。C++17 标准以电子形式发布,价格为 198 瑞士法郎。

  • C++17 标准是可用的,但似乎不是一种经济的形式——直接来自 ISO,它的成本为 198 瑞士法郎(约 200 美元)。对于大多数人来说,标准化之前的最终草案已经足够了(而且是免费的)。许多人会更喜欢更新的草稿,记录可能包含在 C++20 中的新特性。

  • 新 C++ (C++11/14) 概述(仅 PDF)(Scott Meyers)(针对 C++14 更新) 这些是由Scott Meyers,一位备受尊敬的 C++ 作家。尽管项目列表很短,但质量很高。

  • C++ 核心指南 (C++11/14/17/...)(由 Bjarne Stroustrup 和 Herb Sutter 编辑)是一个不断发展的在线文档,其中包含一组用于使用现代 C++ 的指南。该指南侧重于相对更高级别的问题,例如接口、资源管理、内存管理以及影响应用程序架构和库设计的并发性。该项目由 Bjarne Stroustrup 和其他人在 CppCon'15 上宣布,并欢迎社区的贡献。大多数指南都附有基本原理和示例以及对可能的工具支持的讨论。许多规则是专门为静态分析工具自动检查而设计的。

  • C++ 超级常见问题解答(Marshall Cline、Bjarne Stroustrup 等)是标准 C++ 基金会的一项努力,旨在统一以前由 Marshall Cline 和 Bjarne Stroustrup 单独维护的 C++ 常见问题解答,并纳入新的贡献。这些项目主要解决中级问题,并且通常以幽默的语气书写。并非所有项目都完全符合最新版本的 C++ 标准。

  • cppreference.com (C++03/11/14/17/…)(由 Nate Kohl 发起)是一个总结基本核心语言功能的 wiki,并拥有 C++ 标准库的大量文档。该文档非常精确,但比官方标准文档更易于阅读,并且由于其 wiki 特性提供了更好的导航。该项目记录了 C++ 标准的所有版本,并且该站点允许过滤特定版本的显示。该项目由 Nate Kohl 在 CppCon'14 上介绍


经典/旧

注意:这些书中包含的某些信息可能不是最新的或不再被视为最佳实践。

  • C++ 的设计和演变(Bjarne Stroustrup) 如果你想知道为什么这门语言是这样的,这本书就是你找到答案的地方。这涵盖了 C++标准化之前的所有内容。

  • 关于 C++ 的思考——(Andrew Koenig 和 Barbara Moo) [评论]

  • 高级 C++ 编程风格和习语(James Coplien) 模式运动的前身,它描述了许多 C++ 特定的“习语”。这当然是一本非常好的书,如果你能抽出时间,它可能仍然值得一读,但它已经很老了,而且与当前的 C++ 不兼容。

  • 大规模 C++ 软件设计(John Lakos) Lakos 解释了管理非常大的 C++ 软件项目的技术。当然,如果它只是最新的,那是一本好书。它是在 C++ 98 之前很久就编写的,并且遗漏了许多对大型项目很重要的特性(例如命名空间)。如果您需要处理一个大型 C++ 软件项目,您可能想阅读它,尽管您需要的不仅仅是一粒盐。不要与扩展后的系列大型 C++ 卷 I-III 混淆。

  • C++ 对象模型内部(Stanley Lippman)找到对此类主题的彻底讨论。

  • The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis) 这本书已经过时了,因为它探讨了 1989 年的 C++ 2.0 版本——模板、异常、命名空间和新的类型转换还没有引入。话虽如此,这本书贯穿了当时的整个 C++ 标准,解释了该语言的基本原理、可能的实现和特性。这不是一本学习 C++ 编程原理和模式的书,而是一本了解 C++ 语言各个方面的书。

  • 用 C++ 思考(Bruce Eckel,第 2 版,2000)。两卷;是一套免费的教程式入门级书籍。下载:第 1卷,第 2 卷。不幸的是,它们被许多微不足道的错误所破坏(例如,保持临时变量是自动的const),没有正式的勘误表。http://www.computersciencelab.com/Eckel.htm上提供了部分第 3勘误表,但显然没有维护。

  • 科学与工程 C++:高级技术和示例介绍(John Barton 和 Lee Nackman)这是一本全面且非常详细的书,试图在数值方法的背景下解释和利用 C++ 中可用的所有功能。它当时引入了几种新技术,例如奇怪重复模板模式(CRTP,也称为 Barton-Nackman 技巧)。它开创了多种技术,例如维度分析和自动微分。它附带了许多可编译且有用的代码,从表达式解析器到 Lapack 包装器。该代码仍然可以在线获得. 不幸的是,这些书的风格和 C++ 特性已经有些过时了,然而,在当时(1994 年,STL 之前),它是一部令人难以置信的杰作。动态继承的章节理解起来有点复杂,也不是很有用。这本经典书籍的更新版本,包括移动语义和从 STL 中吸取的教训,将会非常好。

于 2008-12-23T05:52:48.530 回答