绝对的C++书籍指南和列表

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

与其他许多编程语言不同的是,人们常常从互联网上找到的教程中随手拈来,很少有人能够在不学习一本写得很好的C++书的情况下迅速掌握C++。它太大太复杂了,不适合这样做。事实上,它是如此之大,如此之复杂,以至于_有很多非常糟糕的C++书籍_在那里。我们谈论的不是糟糕的风格,而是诸如有明显的事实错误和推广糟糕的编程风格的东西。

请编辑已接受的答案,以提供高质量的书籍和大致的技能水平--最好是C++聊天室中讨论了你的补充后__。(如果常客们不同意你的推荐,他们可能会无情地撤销你的工作)。在每本书中加入你个人阅读过的/受益于的简短简介/描述。请自由辩论质量、标题等。符合标准的书籍将被添加到列表中。 有C和C++用户协会(ACCU)评论的书籍有评论的链接。

*注意:FAQ和其他资源可以在[C++标签信息](https://stackoverflow.com/tags/c%2b%2b/info)和[tag:c++-faq]下找到

初学者

入门级,没有编程经验

  • C++ Primer * (Stanley Lippman, Josée Lajoie, and Barbara E. Moo) (updated for C++11) 这本书有1千多页,是一本非常全面的C++介绍,以一种非常容易理解的形式,非常详细地涵盖了该语言的几乎所有内容。第五版(2012年8月16日发布)涵盖了C++11。 [评论]
  • 编程:使用C++的原则和实践 (Bjarne Stroustrup, 2nd Edition - May 25, 2014) (updated for C++11/C++14) 由C++语言的创造者对使用该语言进行编程的介绍。这是一本很好的读物,它假设没有任何编程经验,但不只适合初学者。 读者可在此阅读。 *不要与C++ Primer Plus(Stephen Prata)相混淆,后者的[评论]明显不那么好(http://accu.org/index.php?module=bookreviews&func=search&rid=1744)。

介绍性的,以前有编程经验的

  • A Tour of C++ (Bjarne Stroustrup) (C++17的第二版)这本 "巡礼 "是对所有标准C++(语言和标准库,和使用C++11)的快速(约180页,14章)教程概述,水平适中,适合已经知道C++或至少是有经验的程序员。本书是构成《C++程序设计语言》第4版第2-5章的材料的扩展版本。

  • Accelerated C++ (Andrew Koenig and Barbara Moo, 1st Edition - August 24, 2000) 这本书基本上涵盖了与_C++ Primer_相同的内容,但只用了其四分之一的空间。这主要是因为它并不试图成为编程的介绍,而是为以前用其他语言编程的人介绍C++。它的学习曲线比较陡峭,但是,对于那些能够应付的人来说,它是一种非常紧凑的语言介绍。(从历史上看,它是第一本使用现代方法教授该语言的初学者书籍,从而开创了新局面)。)尽管这样,它所教授的C++ 它所教授的是纯粹的C++98。[评论]

    最佳实践

  • Effective C++ (Scott Meyers, 3rd Edition - May 22, 2005) 这本书的目的是成为C++程序员应该阅读的最好的第二本书,它成功了。早期的版本是针对来自C语言的程序员,第三版改变了这一点,针对来自Java等语言的程序员。它以一种非常容易理解(和令人愉快)的风格介绍了~50条易于记忆的经验法则及其原理。对于C++11和C++14来说,例子和一些问题已经过时了,应该首选Effective Modern C++。[评论]

  • Effective Modern C++ (Scott Meyers) 这基本上是_Effective C++_的新版本,针对正在从C++03向C++11和C++14过渡的C++程序员。

  • Effective STL (Scott Meyers) 本书旨在对来自STL的部分标准库做同样的工作,就像_Effective C++_对整个语言所做的一样。它提出了一些经验法则,以及它们的理由。[评论]

    ##中级

  • More Effective C++ (Scott Meyers) 比_Effective C++_的经验法则还要多。虽然没有第一本书中的那么重要,但还是很值得了解的。

  • Exceptional C++ (Herb Sutter) 这本书以一组谜题的形式呈现,通过资源获取是初始化(RAII)对C++中正确的资源管理和异常安全进行了最好和最透彻的讨论,此外还深入介绍了其他各种主题,包括pimpl习语、名称查找、良好的类设计和C++内存模型。[评论]

  • More Exceptional C++ (Herb Sutter) 除了讨论C++中有效的面向对象编程和正确使用STL外,还涵盖了_Exceptional C++_中未涉及的其他异常安全主题。[评论]

  • 例外的C++风格 (Herb Sutter) 讨论了通用编程、优化和资源管理;这本书还对如何通过使用非成员函数和单一责任原则在C++中编写模块化代码进行了出色的阐述。[评论]

  • _C++编码标准 (Herb Sutter and Andrei Alexandrescu) "编码标准 "在这里并不意味着 "我的代码应该缩进多少个空格?" 本书包含了101个最佳实践、习语和常见的陷阱,可以帮助你写出正确、可理解和高效的C++代码。[评论]

  • _C++模板:完整指南 (David Vandevoorde and Nicolai M. Josuttis) 这是一本关于C++11之前存在的模板的书。它涵盖了从最基本的东西到一些最先进的模板元编程,解释了模板工作的每一个细节(包括概念上和如何实现)并讨论了许多常见的陷阱。 在附录中对单一定义规则(ODR)和重载解决进行了很好的总结。涵盖C++11、C++14和C++17的[第二版](http://amzn.com/0321714121)已经出版。[[评论]](http://accu.org/index.php?module=bookreviews&func=search&rid=506)

  • C++ 17 - The Complete Guide (Nicolai M. Josuttis) 本书介绍了C++17标准中引入的所有新功能,包括从简单的'内联变量'、'constexpr if'一直到'多态内存资源'和'新和删除超对齐数据'。

    ###高级

  • Modern C++ Design (Andrei Alexandrescu) 一本关于高级通用编程技术的开创性书籍。 介绍了基于策略的设计、类型列表和基本的泛型编程习惯,然后解释了许多有用的设计模式(包括小型对象分配器、漏斗、工厂、访问者和多方法)如何使用泛型编程高效、模块化和干净地实现。[评论]

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

  • C++ Concurrency In Action (Anthony Williams) 一本涵盖C++11并发支持的书,包括线程库、原子库、C++内存模型、锁和互斥,以及设计和调试多线程应用的问题。涵盖C++14和C++17的第二版已经出版。

  • Advanced C++ Metaprogramming (Davide Di Gennaro) 一本C++11之前的TMP技术手册,更注重实践而非理论。 书中有大量的片段,其中一些被类型特征所淘汰,但这些技术还是很有用的。 如果你能忍受古怪的格式/编辑,这本书比Alexandrescu更容易阅读,而且可以说,更有价值。 对于更有经验的开发者来说,你很有可能学到一些关于C++黑暗角落的东西(一种怪癖),而这些东西通常只有通过丰富的经验才能得到。

    参考文献风格--所有级别

  • [http://www.amazon.com/dp/0321958322/](Bjarne Stroustrup)(**为C++11更新)C++的经典介绍,由其创造者编写。本书与经典的《K&R》并行,读起来确实很像,涵盖了从核心语言到标准库,到编程范式到语言哲学的所有内容。[Review] 注意:C++标准的所有版本都在这个问题中得到了跟踪。Where do I find the current C++ standard.

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

  • The C++ IO Streams and Locales (Angelika Langer and 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的新特性。

  • Overview of the New C++ (C++11/14) (PDF only) (Scott Meyers) (updated for C++14) 这些是Scott Meyers提供的三天培训课程的演示材料(幻灯片和一些讲义),他是一位备受尊敬的C++作者。尽管项目清单很短,但质量却很高。

  • The [C++ Core Guidelines (C++11/14/17/...)] (https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md)(由Bjarne Stroustrup和Herb Sutter编辑)是一个不断发展的在线文件,包括一套良好使用现代C++的准则。这些指南集中在相对较高层次的问题上,如影响应用结构和库设计的接口、资源管理、内存管理和并发。该项目是由Bjarne Stroustrup等人在CppCon'15上宣布的,并欢迎社区的贡献。大多数指南都补充了理由和例子,以及对可能的工具支持的讨论。许多规则被专门设计为可由静态分析工具自动检查。

  • C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup and others) 是标准C++基金会为统一以前由Marshall Cline和Bjarne Stroustrup单独维护的C++常见问题而做出的努力,同时也包含了新的贡献。这些项目大多是针对中级水平的问题,通常以幽默的口吻来写。并非所有的项目都是最新版本的C++标准的最新版本。

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

    经典/旧版

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

  • The Design and Evolution of C++ (Bjarne Stroustrup) 如果你想知道为什么语言是这样的,这本书是你找到答案的地方。这本书涵盖了C++标准化之前的一切。

  • Ruminations on C++ - (Andrew Koenig and Barbara Moo) [评论]

  • Advanced C++ Programming Styles and Idioms (James Coplien) 作为模式运动的前身,它描述了许多针对C++的 "习惯"。这当然是一本非常好的书,如果你能抽出时间,可能仍然值得一读,但相当老旧,而且不是当前C++的最新版本。

  • 大型C++软件设计 (John Lakos) Lakos解释了管理大型C++软件项目的技术。当然,这是一本好书,如果它是最新的就好了。这本书是在C++98之前写的,错过了许多对大型项目很重要的功能(如命名空间)。如果你需要在一个大型的C++软件项目中工作,你可能想读一读,尽管你需要对它多加注意。新版的第一卷是[预计在2019年](http://www.amazon.com/dp/0201717069)。

  • Inside the C++ Object Model (Stanley Lippman) 如果你想知道虚拟成员函数通常是如何实现的,基础对象在多继承情况下通常是如何在内存中布局的,以及这一切是如何影响性能的,在这里你可以找到关于此类主题的详尽讨论。

  • The Annotated C++ Reference Manual (Bjarne Stroustrup, Margaret A. Ellis) 这本书相当过时,因为它探讨的是1989年的C++2.0版本--模板、异常、命名空间和新的铸模还没有引入。不过,本书对当时的整个C++标准进行了阐述,解释了语言的原理、可能的实现方式和特点。这不是一本学习C++编程原理和模式的书,而是了解C++语言的各个方面。

  • Thinking in C++(Bruce Eckel,第二版,2000年)。 两卷;是一套教程式的*免费的入门级书籍。下载。vol 1, vol 2。不幸的是,它们被一些琐碎的错误所破坏(例如,坚持认为暂时性的东西是自动的`const'),没有官方的勘误表。一个部分的3rd方勘误表可在(http://www.computersciencelab.com/Eckel.htm)上找到,但它’显然没有被维护

  • Scientific and Engineering C++:An Introduction to Advanced Techniques and Examples (John Barton and Lee Nackman) 这是一本全面的、非常详细的书,试图在数值方法的背景下解释和利用C++中的所有功能。它在当时引入了一些新的技术,如奇怪的重复模板模式(CRTP,也叫Barton-Nackman技巧)。 它开创了一些技术,如尺寸分析和自动微分。 它附带了很多可编译的、有用的代码,从表达式分析器到Lapack包装器。 这些代码仍然可以在这里找到:http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934。 不幸的是,这些书的风格和C++功能已经有些过时了,然而,在当时(1994年,STL之前),这是一个令人难以置信的巡回演出。 关于动态继承的章节,理解起来有点复杂,而且不是很有用。 这本经典书籍的更新版本,包括移动语义和从STL中吸取的教训,将会非常好。

评论(22)