《C++权威指南》书单

4230

这个问题试图收集每年出版的几本糟糕的C++书籍中的一些精华。

与许多其他编程语言不同,人们很少能够快速掌握C++而不阅读一本写得好的C++书籍。它太大且太复杂了。事实上,它是如此之大和复杂,以至于存在着非常多非常糟糕的C++书籍。我们所说的不是糟糕的风格,而是指存在明显的事实错误和促进极差的编程风格等问题。

请编辑已接受的答案,提供优质的书籍和大约的技能水平 - 最好在C++聊天室讨论后进行添加。 (如果他们不同意建议,那么经常出现在那里的用户可能会无情地撤销您的工作。)为您个人阅读/获益的每本书增加简短的说明/描述。欢迎辩论质量、标题等。符合条件的书籍将被添加到列表中。 符合要求且由ACCU(C和C++用户协会)评论的书籍附有评论链接。

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

1个回答

5924

初学者

入门级,无编程经验

书籍 作者 描述 评论
C++ Primer*

* 不要与C++ Primer Plus(Stephen Prata)混淆,后者的评论较差。
Stanley Lippman, Josée Lajoie, and Barbara E. Moo (适用于C++11的更新版本) 这本书有1000页,是一本非常全面的C++入门教程,以非常易懂的格式和详细的内容涵盖了语言的几乎所有方面。第五版(2012年8月16日发布)涵盖了C++11。 [评论]
Programming: Principles and Practice Using C++ Bjarne Stroustrup, 第二版 - 2014年5月25日 (适用于C++11/C++14的更新版本) 这是一本由语言创始人编写的使用C++进行编程的入门教程。它不仅适合初学者,还可以帮助没有编程经验的读者入门。

有编程经验的简介

书籍 作者 描述 评论
《C++之旅》 Bjarne Stroustrup(C++17第2版C++20第3版 这本书是一个快速(大约180页和14章)的教程概述,涵盖了所有标准C++(语言和标准库,以及使用C++11),适合已经了解C++或至少有经验的程序员。这本书是《C++程序设计语言》第4版第2-5章的扩展版本。
《加速C++》 Andrew Koenig和Barbara Moo,第1版 - 2000年8月24日 这本书基本上涵盖了与《C++ Primer》相同的内容,但是只用了四分之一的篇幅。这主要是因为它不试图成为一个编程入门教材,而是为那些之前在其他语言中有编程经验的人提供了一个C++入门教程。它的学习曲线较陡,但对于那些能够应对的人来说,它是一本非常简洁的语言入门教程。(从历史上看,它是第一本使用现代教学方法的初学者书籍。)尽管如此,它所教授的C++纯粹是C++98。 [评论]

最佳实践

书籍 作者 描述 评论
Effective C++ Scott Meyers, 第三版 - 2005年5月22日 这本书的目标是成为C++程序员应该阅读的最佳第二本书,并且它成功了。早期版本针对的是从C语言过来的程序员,第三版改变了这一点,针对的是从像Java这样的语言过来的程序员。它以一种非常易于记忆的法则为主,以及它们的原理,以一种非常易于理解(和享受)的风格呈现。对于C++11和C++14,一些例子和问题已经过时,应该优先选择《Effective Modern C++》。 [评论]
Effective Modern C++ Scott Meyers 这本书针对的是从C++03过渡到C++11和C++14的C++程序员。这本书可以看作是前一本书《Effective C++》的延续和“修正”。它们没有涵盖相同的内容,但保持了类似的基于项目的主题。 [评论]
Effective STL Scott Meyers 这本书的目标是对来自STL的标准库的部分进行与《Effective C++》对整个语言所做的相同的事情:它提供了一些法则以及它们的原理。

Intermediate

书籍 作者 描述 评论
更有效的C++ Scott Meyers Effective C++更多的经验法则。虽然不如第一本书中的那些重要,但仍然值得了解。
卓越的C++ Herb Sutter 以一系列谜题的形式呈现,本书对C++中的正确资源管理和异常安全性进行了深入讨论,包括资源获取即初始化(RAII)以及其他各种主题的全面覆盖,如pimpl惯用语法、名称查找、良好的类设计和C++内存模型。 [评论]
更多卓越的C++ Herb Sutter 除了讨论C++中未涵盖的其他异常安全性主题外,本书还涵盖了C++中有效的面向对象编程和正确使用STL的内容。 [评论]
卓越的C++风格 Herb Sutter 讨论泛型编程、优化和资源管理;本书还通过使用非成员函数和单一职责原则,对如何编写模块化的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++实战 Bartosz Milewski 本书通过从零开始构建一个应用程序来解释C++及其特性。 [评论]
C++中的函数式编程 Ivan Čukić 本书将函数式编程技术引入现代C++(C++11及更高版本)。对于那些希望将函数式编程范式应用于C++的人来说,这是一本非常好的读物。

高级
书籍 作者 描述 评论
现代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++卷一,过程和架构 (2020) John Lakos 这是一本三卷系列的第一部分,扩展了旧书《大规模C++设计》。Lakos解释了管理非常庞大的C++软件项目的经过实战验证的技术。如果你在一个大型的C++软件项目中工作,这本书是一本很好的读物,详细介绍了物理结构和逻辑结构之间的关系、组件的策略以及它们的重用。 [评论]

参考样式 - 所有级别
书籍 作者 描述 评论
《C++编程语言》 Bjarne Stroustrup(更新至C++11 这是C++之父所写的经典介绍C++的书籍。与经典的K&R并行编写,这本书几乎涵盖了从核心语言到标准库,再到编程范式和语言哲学的方方面面。 [评论]
注意:C++标准的所有版本都可以在问题“我在哪里找到当前的C或C++标准文档?”中找到。
《C++标准库教程与参考手册》 Nicolai Josuttis(更新至C++11 这是C++标准库的介绍和参考手册。第二版(于2012年4月9日发布)涵盖了C++11。 [评论]
《C++ IO流与区域设置》 Angelika Langer和Klaus Kreft 关于流和区域设置,这本书是寻找权威答案的唯一选择。 [评论]
C++11/14/17/... 参考资料:
  • GitHub上发布的LaTeX源代码生成的C++编程语言标准的工作草案

  • C++标准文件,最新的标准工作草案:ISO工作草案

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

  • C++17标准是可用的,但似乎不是以经济形式提供 - 直接从ISO购买需要198瑞士法郎(约200美元)。对于大多数人来说,标准化之前的最终草案已经足够了(而且是免费的)。许多人会更喜欢更新的草案,记录了可能包含在C++20中的新功能。

  • C++20草案可以在GitHub上找到,还有一些旧版本

  • 新C++概述(C++11/14)(仅PDF)(Scott Meyers)(更新为C++14)这些是Scott Meyers提供的为期三天的培训课程的演示材料(幻灯片和一些讲义)。Scott Meyers是一位备受尊敬的C++作者。尽管项目列表很短,但质量很高。

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

  • C++超级常见问题解答(Marshall Cline、Bjarne Stroustrup等人)是由标准C++基金会发起的努力,旨在统一之前由Marshall Cline和Bjarne Stroustrup个别维护的C++常见问题解答,并纳入新的贡献。这些项目主要涉及中级水平的问题,并经常以幽默的口吻书写。并非所有项目都可能与最新版的C++标准完全保持一致。

  • cppreference.com(C++03/11/14/17/…)(由Nate Kohl发起)是一个维基,总结了基本的核心语言特性,并对C++标准库进行了广泛的文档化。该文档非常精确,但比官方标准文档更易读,并且由于是维基的性质,提供了更好的导航。该项目记录了所有版本的C++标准,并允许根据特定版本进行筛选显示。该项目在CppCon'14上由Nate Kohl介绍


经典/旧版

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

  • 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)如果你想知道虚成员函数是如何常见实现的,以及在多重继承场景中基对象是如何常见布局在内存中的,以及所有这些对性能的影响,这本书会对这些主题进行深入讨论。

  • 注释C++参考手册(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上找到,但显然没有得到维护。

  • 科学与工程C++:高级技术和示例介绍(John Barton和Lee Nackman) 这是一本全面而详细的书,试图在数值方法的背景下解释和利用C++中的所有功能。它在当时引入了几种新技术,如奇异递归模板模式(CRTP,也称为Barton-Nackman技巧)。 它开创了几种技术,如量纲分析和自动微分。 它提供了大量可编译和有用的代码,从表达式解析器到Lapack包装器。 代码仍然可在网上获取。 不幸的是,这些书在风格和C++特性上有些过时,但在当时(1994年,STL之前)是一次令人难以置信的壮举。 关于动态继承的章节有些难以理解,也不是很有用。 一个包括移动语义和从STL中学到的经验教训的经典书籍的更新版本将非常好。


537
所有承诺在Y小时内教授X的书籍,例如《24小时学会C ++》。我认为最好避免阅读所有这类书籍。 - akhil_mittal
160
虽然我尊重作者免费在线发布他的教材,但我不建议使用Bruce Eckel的《Thinking in C++》。该书的观点表明对C ++和“面向对象”编程的使用相对较差或无效,类似于GoF设计模式的应用不佳。尽管我认为这是一本有趣的入门书,但随着人们对编程和(尤其是)计算机科学的了解越来越深入,我发现只考虑“传统”的OOP术语的书籍对教育有害。 - user1630889
44
在accu.org网站上,有一部分书评区域,其中带有书籍评级。您可以搜索C++相关的书籍评价。许多这类书籍被评为“不推荐”。 - Zaphod Beeblebrox
19
这是一条非常重要的评论,请管理员不要删除。我有一个反向推荐:"Let Us C++"(《学习C++》)作者是Yashavant Kanetkar。这是一本完全垃圾的书籍。我请求所有初学者/程序员不要阅读此书。阅读这本书就像在章节中教你2+2=4,然后在练习中让你计算宇宙的面积。极具打击积极性。 - haccks
12
能否将 Nicolai Josuttis 的《C++ Move Semantics - The Complete Guide》添加到列表中? - Myrddin Krustowski
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接