Skip to content

Latest commit

 

History

History
89 lines (61 loc) · 17.6 KB

003 - C++ 图书指南.md

File metadata and controls

89 lines (61 loc) · 17.6 KB

https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list

问题

这个问题是希望从每年出版的很多并不是很好的 C++ 书籍中找出一些优秀的作品。

和一些可以在网络教程直接学习的很多编程语言不同,很少有人可以在不阅读优秀的 C++ 书籍的情况下快速学会它,因为这样做太复杂了。事实上,有很多非常糟糕的 C++ 书籍,我不是指各异的编程风格,而是它们存在明显的事实错误甚至推广极其糟糕的编程风格。

请编辑已经被接受的回答来推荐质量高的书籍并且指明它们所适用的阅读者水平——最好是在 C++ 聊天室 (常客们如果意见相左,可能会驳回您的建议)中讨论之后再发表。添加关于您亲自阅读/受益的每本书的简短脱口秀/描述。随意辩论质量、标题等。符合标准的书籍将被添加到列表中。如果这本书在 C/C++ 用户协会(ACCU)有书评,请添加一个链接。

回答

译注:原文采用 Amazon 的商品链接,译文已经更换为 JD 或淘宝的中文版本(译者与其店铺没有合作关系),对于没有更换链接的书籍请自行搜索购买,评价代表原回答社区的意见,可能与国内读者意见有所不同。

初学者

介绍性书籍,之前没有编程经验

  • C++ Primer (Stanley Lippman、Josée Lajoie、and Barbara E. Moo,已更新 C++11 内容)几乎有 1000 页,它非常彻底地介绍了 C++,用可读性很高的格式事无巨细地涵盖了语言中几乎所有的东西。这本书的第5版(发行于 2012.4.16)涵盖了 C++11 内容。「评价」
  • C++ 程序设计原理与实践 (Bjarne Stroustrup,第二版 - 2014.5.25,已更新 C++11/C++14 内容)一本 C++ 之父写的该语言的编程教程,即使没有编程经验的初学者也可以轻松阅读,但它不仅仅是为初学者编写。

介绍性书籍,之前有编程经验

  • C++ 语言导学 (Bjarne Stroustrup,第二版为 C++17 标准)标题中的“导学”是指本书是一个所有标准 C++ 内容(语言和标准库以及如何使用 C++11)的一个快速(大约有 180 页 14 章节)概览,是以中高等水平或至少有经验的开发者的视角编写的。这本书是对工具书的拓展,它包含了《C++ 程序设计语言》第四版的第二章到第五章。
  • Accelerated C++ (Andrew Koenig and Barbara Moo,第一版 - 2000.4.24)它的基础部分内容基本上和 《C++ Primer》相同,但这些只占它的四分之一。这是因为它并不是为了介绍如何编程,而是为已经使用其它语言编程的人介绍 C++。它有更加陡峭的学习曲线,但是啃下这本书就会发现它非常紧凑地介绍了 C++。(从历史的角度来看,它开创了新天地成为第一本使用现代语言教学方法的初学者书)尽管如此,这本书只介绍 C++98 的内容。「评价」

最佳实践

  • Effective C++:改善程序与设计的55个具体做法 (Scott Meyers, 第三版 - 2005.3.22)这本书是为了成为 C++ 编程者最该看的第二本书而编写的,并且它成功了。早期版本是为了帮助 C 编程者了解 C++,第三版改变了受众为使用 Java 等语言的人。它用非常易于理解的风格展示了 50 多个易于记忆的经验法则以及其原理。它关于 C++11 和 C++14 的例子和几个问题已经过时,目前《Effective Modern C++》应该是首选。「评价」
  • Effective Modern C++ (Scott Meyers)它基本上是《Effective C++》的新版本,旨在帮助 C++ 程序员从 C++03 过度到 C++11 和 C++14。
  • Effective STL (Scott Meyers)它旨在对 C++ STL 做与《Effective C++》相同的工作:它提出了经验法则以及其原理。「评价」

中级

  • More Effective C++:35个改善编程与设计的有效方法 介绍了比《Effective C++》更多的经验法则,虽然没有之前那本书介绍的内容重要,但了解一下还是有好处的。
  • Exceptional C++ (Herb Sutter)这本书表现为一组谜题,通过对包含 pimpl 技法、name lookup、良好的类设计和 C++ 内存模型的讨论外,还通过资源获取即初始化(RAII)对 C++ 中正确的资源管理和异常安全进行了极佳和彻底的讨论。「评价」
  • More Exceptional C++ (Herb Sutter)包含了在《Exceptional C++》中没有提到的异常安全话题,并且讨论了在 C++ 中如何有效地面向对象编程和 STL 的正确使用方法。「评价」
  • Exceptional C++ Style (Herb Sutter)讨论了泛型、优化以及资源管理,这本书还很好的阐述了在 C++ 中如何使用非成员函数来编写模块化代码以及单一责任原则。
  • C++ 编程规范 (Herb Sutter and Andrei Alexandrescu)这里的“编程规范”并不是指“我的缩进应该有几个空格?”,这本书包含了 101 个最佳实践方法、编程习惯和常见的陷阱来帮助你写出正确、可读并且高效的 C++ 代码。「评价」
  • C++ Templates (David Vandevoorde and Nicolai M. Josuttis)这本书包含了 C++11 之前就存在的模板。它涵盖了从很基础到最高级的模板元编程方法,解释了模板的工作原理(包括概述以及模板的实现)并讨论一些常见的陷阱。它在附录中巧妙地总结了单一责任原则(ODR)重载解析(overload resolution)。包含 C++11、C++14 和 C++17 的第二版已经发行。「评价」
  • C++ 17 - The Complete Guide (Nicolai M. Josuttis)这本书描述了 C++17 中加入的新功能,从简单的“内联变量”、“constexpr if”一直到“多态内存资源(PMR)”和“利用过度对齐来分配资源”等所有内容。「评价」
  • C++ in Action (Bartosz Milewski)这本书以从头构建一个完整的应用程序来解释 C++ 的功能。「评价」
  • C++ 函数式编程 (Ivan Čukić)这本书描述了现代 C++(C++11 或更新)中的函数式编程技巧。对于想要在项目中灵活运用函数式编程技巧的人来说,这是本非常不错的书。
  • Professional C++ (Marc Gregoire, 第五版 - 2021.2)提供了对 C++ 的实现的全面、详细的介绍,它充满了专业技巧提示以及简洁但内容丰富的文本范例来强调 C++20 的新功能。书中所有范例使用了诸如 modulestd::format 等的一些 C++20 的新功能。

进阶

  • C++ 设计新思维 (Andrei Alexandrescu)一本关于高级泛型编程技术的开创性著作。它介绍了基于策略的设计、Typelist、基本的泛型编程习惯用法,之后解释了很多有用的,可以被高效、模块化且干净地使用泛型实现的设计模式(包括小对象分配器、仿函数、工厂模式、访问者模式以及 multi-methods)。「评价」
  • C++ 模板元编程 (David Abrahams and Aleksey Gurtovoy)
  • C++ 并发编程实战 (Anthony Williams)一本涵盖 C++11 中支持并发内容的书,包括线程库、原子库、C++ 内存模型、锁和互斥锁,以及设计和调试多线程程序时会遇到的问题。覆盖 C++14 和 C++17 内容的第二版已经发行。「评价」
  • Advanced C++ Metaprogramming (Davide Di Gennaro)一本 C++11 之前的*模板元编程(TMP)*技术手册,它更多地关注实践而不是理论。本书中有很多由于类型特征而过时的片段,尽管如此其中的技术还是很值的学习的。如果你能忍受它奇怪的格式,它会比 Alexandrescu 那本更易于阅读,甚至更有价值。对于富有经验的开发者,这是一个了解 C++ 一些不为人知的,只能从丰富的编程经验中获知的冷知识的好机会。

编程风格参考 - 所有水平适用

C++ 11/14/17/... 参考:
  • C++ 11/14/17 标准(INCITS/ISO/IEC 14882:2011/2014/2017)这是最后决定 C++ 是什么的权威。但是,请注意到它只是为了愿意投入大量时间和精力去理解它的经验丰富的人编写的。C++ 17 标准以电子版发售,售价是 198 瑞士法郎。
  • 你可以直接从 ISO 购买 C++17 标准 来阅读,但这种方式显然不太经济。标准发布前的 最终草案 对大多数人已经足够了(而且是免费下载的)。有的人会需要一份 更新的草案 ,其中包含了可能会在 C++20 中加入的新功能。
  • Overview of the New C++ (C++11/14) (Scott Meyers,只有 PDF 版,更新了 C++14 的内容)这些是 Scott Meyers 在一个为时三天的课程中使用的演讲材料(幻灯片和一些讲义),他是 C++ 领域备受尊敬的作家,作品不多但是质量都很高。
  • C++ 核心准则 (C++11/14/17/...) (edited by Bjarne Stroustrup and Herb Sutter)这是一个在不断更新的关于如何使用现代 C++ 的在线文档。这些准测更多的侧重于相对高级的问题,比如接口、资源管理、内存管理、并发对应用程序架构和设计库的影响。这个项目 由 Bjarne Stroustrup 等人在 CppCon'15 发起 并且欢迎社区的贡献。其中大多数准则都补充有基本原理和示例以及有关可能支持的工具的讨论。许多规则经过专门的设计,可以用静态分析工具自动地进行检查。
  • C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup and others)是标准 C++ 基金会为了统一之前由 Marshall Cline 和 Bjarne Stroustrup 单独维护的 C++ FAQ 所做的努力,并且纳入新的贡献。这些问答经常以中级的水平和幽默的语言来表达。可能并不是所有条目都完全符合最新的 C++ 标准。
  • cppreference.com (C++03/11/14/17/...) (由 Nate Kohl 发起)是一个概述了基本的核心语言功能的百科,并且提供了有关 C++ 标准库的大量文档。该文档非常准确且比正式标准文档更易于阅读,由于它 wiki 的性质又提供了良好的导航。它记录了 C++ 标准的所有版本,并且允许过滤显示特定版本的内容。由 Nate Kohl 在 CppCon'14 上发起

经典书/旧书

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

  • C++ 语言的设计和演化 (Bjarne Stroustrup)你可以在这本书里找到为什么 C++ 会这么设计,它涵盖了 C++ 在标准化之前的所有内容。
  • **C++ 沉思录 ** (Andrew Koenig and Barbara Moo)「评价」
  • Advanced C++ Programming Styles and Idioms (James Coplien)pattern movement 的前身,它描述了许多 C++ 特有的“编程习惯”。如果你有空闲的话,这当然是一本非常值得一读的书,但它已经很久没有和更新的 C++ 标准适配了。
  • 大规模 C++ 程序设计 (John Lakos)Lakos 在这本书里描述了如何大型 C++ 软件项目。如果它更新了的话,当然会是一本好书。但它是在 C++98 之前编写的,并且错过了对大型项目很重要的如 namespace 的许多功能。如果你需要参与大型 C++ 软件项目,就很需要阅读这本要花费很多精力的书。新版本的第一卷 在 2019 年发行。
  • 深度探索C++对象模型 (Stanley Lippman)如果你想知道通常在多继承方案中如何实现虚函数以及基础对象是如何被布置在内存中的,以及所有这些内容对性能的影响,那么你可以在这本书中找到这些主题相关的详尽的讨论。
  • The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis)在这本书探索了 1989 年的 C++ 2.0 版本的事实上来说,它就已经过时了——尚未引入模板、异常、名称空间和新类型。话虽如此,这本书还是贯穿了当时的整个 C++ 标准,解释了该语言的基本原理、可能的实现和功能。这不是一本用来学习 C++ 编程原理和模式的书,而是一本了解 C++ 语言的各个方面的书。
  • C++ 编程思想 (Bruce Eckel,第二版 2000 年)分成两卷;是一本免费的入门教程书籍,可以在 第一卷 第二卷 下载。不幸的是,它有一些虽然不是那么重要的错误(比如坚持了 temporaries are automatically const)并且还没有官方的勘误列表。在 http://www.computersciencelab.com/Eckel.htm 有一个第三方的勘误表,但显然已经不再维护了。
  • Scientific and Engineering C++: An Introduction to Advanced Techniques and Examples (John Barton and Lee Nackman)这是一本非常全面且详细的书,它试图用数学方法来解释和利用 C++ 中可用的所有功能。它介绍了当时的几种新技术,比如奇异递归模板模式(CRTP,也被称为 F-bound polymorphism)。它开创了如*因次分析 (Dimensional analysis)自動微分 (Automatic differentiation)*的技术。提供了很多有用的代码,包括表达式解析器到 LAPACK 包装器,代码还是可以 在网络上查看 。不幸的是,这本书在风格和 C++ 功能上已经过时了,尽管如此,在当时(1994 年,STL 之前)仍然是一本极好的书。关于动态遗传的章节有点复杂、难以理解,也不太有用。如果它更新了包括移动语义和 STL 中汲取的教训在内的内容的话,将会非常棒。