权威的 C ++ 书籍指南和清单

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

与许多其他编程语言不同,这些语言通常是在 Internet 上的教程中经常使用的,而没有学习一本写得很好的 C ++ 书籍的人很少能够快速使用 C ++。这样做太大,太复杂。实际上,它是如此之大和复杂,以至于有很多非常糟糕的 C ++ 书籍 。我们不是在谈论不良的风格,而是诸如炫耀明显的事实错误推广极差的不良编程风格之类的东西

请编辑接受的答案,以提供优质的书籍和大致的技能水平 - 最好 在 C ++ 聊天室中讨论添加内容 之后 。 (如果常规员工不同意建议,他们可能会毫不留情地撤消您的工作。)为您亲自阅读 / 从中受益的每本书添加简短的简介 / 说明。随时讨论质量,标题等。符合条件的书籍将添加到列表中。具有 C 和 C ++ 用户协会(ACCU)的评论的书籍具有该评论的链接。

* 注意:常见问题解答和其他资源可以在C ++ 标签信息

答案

初学者

入门,以前没有编程经验

  • C ++ Primer *(Stanley Lippman,JoséeLajoie 和 Barbara E. Moo)( 针对 C ++ 11 更新 )以 1k 页的篇幅对 C ++进行了非常全面的介绍,它以易于访问的格式涵盖了该语言的几乎所有内容。并且非常详细。第五版(2012 年 8 月 16 日发布)涵盖了 C ++ 11。 [评论]

  • 编程:使用 C ++ 的原理和实践 (Bjarne Stroustrup,第二版,2014 年 5 月 25 日)( 已针对 C ++ 11 / C ++ 14 更新 )语言的创建者对使用 C ++ 进行编程的介绍。一本不错的书,它假定您没有任何编程经验,而且不仅适合初学者。

* 不要与混淆C ++ 的 Primer Plus (斯蒂芬 · 普拉塔),有显著不太有利的评论

入门,具有以前的编程经验

  • C ++ 导览 (Bjarne Stroustrup)( C ++ 17 的第二版 )“导览” 是对所有标准 C ++(语言和标准库以及使用 C ++ )的快速概览(约 180 页和 14 章)。 11 )对于已经了解 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 ++ (Scott Meyers)这基本上是有效 C ++的新版本,针对的是 C ++ 程序员,从 C ++ 03 过渡到 C ++ 11 和 C ++ 14。

  • 有效的 STL (Scott Meyers)旨在对标准库中来自 STL 的部分进行相同的操作,就像有效的 C ++对整个语言所做的一样:它提供了经验法则及其原理。 [评论]

中间

  • 更有效的 C ++ (Scott Meyers)比 “ 有效 C ++”更多的经验法则。虽然不如第一本书中的重要,但还是很高兴知道。

  • 杰出的 C ++ (草皮萨特)以一系列难题的形式呈现,它对 C ++ 中通过资源获取即初始化(RAII)进行适当的资源管理和异常安全性进行了最佳而透彻的讨论,此外还深入探讨了各种其他主题包括 pimpl 习惯用法,名称查找,良好的类设计和 C ++ 内存模型。 [评论]

  • 更多有关 Exceptional 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 ++ 设计 (Andrei Alexandrescu)关于高级通用编程技术的开创性著作。介绍基于策略的设计,类型列表和基本的通用编程习惯用法,然后说明可以使用通用编程高效,模块化和干净地实现多少有用的设计模式(包括小对象分配器,函子,工厂,访问者和多方法) 。 [评论]

  • C ++ 模板元编程 (David Abrahams 和 Aleksey Gurtovoy)

  • C ++ 并发性实践 (Anthony Williams)涵盖 C ++ 11 并发性支持的书,其中包括线程库,原子库,C ++ 内存模型,锁和互斥体,以及设计和调试多线程应用程序的问题。已经出版了涵盖 C ++ 14 和 C ++ 17 的第二版

  • 高级 C ++ 元编程 (Davide Di Gennaro),TMP 技术的 C ++ 11 之前的手册,更着重于实践而不是理论。本书中有很多片段,其中一些由于类型特征而变得过时,但是仍然可以了解一些技巧。如果您可以忍受古怪的格式 / 编辑,那么它比 Alexandrescu 更容易阅读,并且可以说是更有收获的。对于经验丰富的开发人员,您很有可能会从 C ++ 的一个黑角(怪癖)中获得一些东西,而这些东西通常只能通过丰富的经验来实现。


参考样式 - 所有级别

  • C ++ 编程语言 (Bjarne Stroustrup)( 已针对 C ++ 11 更新 )创建者对 C ++ 的经典介绍。与经典 K&R 并行编写,它的读法非常像它,涵盖了从核心语言到标准库,从编程范例到语言哲学的几乎所有内容。 [评论]注意:此问题跟踪所有 C ++ 标准版本: 在哪里可以找到当前的 C ++ 标准

  • C ++ 标准库教程和参考 (Nicolai Josuttis)( 已针对 C ++ 11 更新 )C ++ 标准库介绍和参考。第二版(2012 年 4 月 9 日发布)涵盖 C ++ 11。 [评论]

  • C ++ IO 流和语言环境 (Angelika Langer 和 Klaus Kreft)关于这本书的内容很少说,除了,如果您想了解有关流和语言环境的任何知识,那么这是找到确定答案的地方。 [评论]

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 更新 )这些是由 Google 提供的为期三天的培训课程的演示材料(幻灯片和一些讲义)斯科特 · 迈耶斯(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 ++ FAQ,并且还加入了新的贡献。这些项目大多以中级水平解决问题,并且通常以幽默的语气写出来。并非所有项目都可以完全使用最新版本的 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 ++ 软件项目中工作,则可能需要阅读它,尽管您需要花很多精力。新版本的第一卷预计将于 2019 年发布

  • 在 C ++ 对象模型内部 (Stanley Lippman)如果您想知道在多继承方案中通常如何实现虚拟成员函数以及在内存中通常如何布置基础对象,以及这如何影响性能,那么您将在这里找到有关此类主题的详尽讨论。

  • 《带注释的 C ++ 参考手册》 (Bjarne Stroustrup,玛格丽特 ·A· 埃利斯)在探索 1989 C ++ 2.0 版本的事实方面已经过时了 - 尚未引入模板,异常,名称空间和新类型。话虽如此,这本书还是遍历了整个 C ++ 标准,解释了该语言的基本原理,可能的实现和功能。这不是一本学习 C ++ 编程原理和模式的书,而是一本了解 C ++ 语言各个方面的书。

  • 《用 C ++ 进行思考》 (Bruce Eckel,第二版,2000 年)。两卷;是一套教程风格的入门级免费书籍。下载: 第 1 第 2 卷 。不幸的是,它们被许多琐碎的错误所破坏(例如,保持临时对象自动为const ),没有正式的勘误表。的部分第三方勘误表可在( http://www.computersciencelab.com/Eckel.htm ),但它显然不能维持。

  • 《科学与工程 C ++:高级技术和示例简介》 (约翰 · 巴顿和李 · 纳克曼)这本书是一本全面而非常详尽的书,试图在数值方法的背景下解释和利用 C ++ 中的所有功能。当时它引入了几种新技术,例如 “好奇重复模板模式”(CRTP,也称为 Barton-Nackman 技巧)。它开创了多种技术,例如尺寸分析和自动区分。它附带了许多可编译且有用的代码,从表达式解析器到 Lapack 包装器。该代码仍在此处提供: http : //www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934 。不幸的是,这些书的样式和 C ++ 功能已经有些过时了,但是,这在当时是不可思议的巡回演出(1994,STL 之前)。关于动力学继承的章节有些复杂,难以理解,并且没有什么用处。这本经典书籍的更新版本非常不错,其中包括移动语义和从 STL 中吸取的教训。