极客时间已完结课程限时免费阅读

新春福利 | C++好书荐读

新春福利 | C++好书荐读-极客时间

新春福利 | C++好书荐读

讲述:吴咏炜

时长18:06大小16.53M

写在前面

你好,我是吴咏炜。
今天我会介绍一些我觉得好并且值得推荐的书,但我不会提供任何购买或下载链接。前者没有必要,大家应该都知道怎么搜索;后者我个人认为违反道义。这些书没有哪本是程序员买不起的。如果书作者没有提供免费下载,而市面上又买不到某本书的话,那自己偷偷找个下载渠道也情有可原——但也请你不要分享出来、告诉我或者其他人。即使你认为以后别人复制你的作品是完全没有问题的(事实上我很怀疑这点,除非你是个硬核的自由软件贡献者),也不等于你有权利复制别人的作品。

入门介绍

Bjarne Stroustrup, A Tour of C++, 2nd ed. Addison-Wesley, 2018
中文版:王刚译,《C++ 语言导学》(第二版)。机械工业出版社,2019
推荐指数:★★★★★
(也有第一版的影印版,那就不推荐了。)
这是唯一一本较为浅显的全面介绍现代 C++ 的入门书。书虽然较薄,但 C++ 之父的功力在那里(这不是废话么😂),时有精妙之论。书的覆盖面很广,介绍了 C++ 的基本功能和惯用法。这本书的讲授方式,也体现了他的透过高层抽象来教授 C++ 的理念。
Michael Wong 和 IBM XL 编译器中国开发团队,《深入理解 C++11:C++11 新特性解析与应用》。机械工业出版社,2013
推荐指数:★★★☆
这本书我犹豫了好久是否应该推荐。Michael Wong 是 C++ 标准委员会委员,内容的权威性没有问题。但这本书,从电子书版本(Kindle 和微信读书上都有此书)看,排印错误不少——校对工作没有做好。我觉得,如果你已经熟悉 C++98,想很系统地检视一下 C++11 的新特性,这本书可能还比较适合。(我只讲了一些重点的现代 C++ 特性,完整性相差很远。)

最佳实践

Scott Meyers, Effective C++: 55 Specific Ways to Improve Your Programs and Designs, 3rd ed. Addison-Wesley, 2005
中文版:侯捷译《Effective C++ 中文版》(第三版)。电子工业出版社,2011
推荐指数:★★★★
Scott Meyers, Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library. Addison-Wesley, 2001
中文版:潘爱民、陈铭、邹开红译《Effective STL 中文版》。清华大学出版社,2006
推荐指数:★★★★
Scott Meyers, Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14. O’Reilly, 2014
中文版:高博译《Effective Modern C++ 中文版》。中国电力出版社,2018
推荐指数:★★★★★
C++ 的大牛中有三人尤其让我觉得高山仰止,Scott Meyers 就是其中之一——Bjarne 让人感觉是睿智,而 Scott Meyers、Andrei Alexandrescu 和 Herb Sutter 则会让人感觉智商被碾压。Scott 对 C++ 语言的理解无疑是非常深入的,并以良好的文笔写出了好几代的 C++ 最佳实践。我读过他整个 Effective 系列四本书,每一本都是从头看到尾,收获巨大。(之所以不推荐第二本 More Effective C++,是因为那本没有出过新版,1996 年的内容有点太老了。)
这几本书讨论的都是最佳实践,因此,如果你没有实际做过 C++ 项目,感触可能不会那么深。做过实际项目的一定会看到,哦,原来我也犯了这个错误啊……如果你不想一下子看三本,至少最后一本属于必修课。
值得一提的是,这三本的译者在国内都是响当当的名家,翻译质量有保证。因此,这几本看看中文版就挺好。

深入学习

Herb Sutter, Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions. Addison-Wesley, 1999
中文版:卓小涛译《Exceptional C++ 中文版》。中国电力出版社,2003
推荐指数:★★★★
我已经说过,我认为 Herb Sutter 是 C++ 界最聪明的三人之一。在这本书里,Herb 用提问、回答的形式讨论了很多 C++ 里的难点问题。虽然这本书有点老了,但我认为你一定可以从中学到很多东西。
Herb Sutter and Andrei Alexandrescu, C++ Coding Standards: 101 Rules, Guidelines, and Best Practices. Addison-Wesley, 2004
中文版:刘基诚译《C++ 编程规范:101 条规则准则与最佳实践》。人民邮电出版社,2006
推荐指数:★★★★
两个牛人制定的 C++ 编码规范。与其盲目追随网上的编码规范(比如,Google 的),不如仔细看看这两位大牛是怎么看待编码规范方面的问题的。
侯捷,《STL 源码剖析》。华中科技大学出版社,2002
推荐指数:★★★★☆
这本是我推荐的唯二的直接以中文出版的 C++ 技术书。侯捷以庖丁解牛的方式,仔细剖析了早期 STL 的源码——对于不熟悉 STL 代码的人来说,绝对可以学到许多。我当年从这本书中学到了不少知识。虽说那里面的 STL 有点老了,但同时也更简单些,比今天主流的 STL 容易学习。
同时仍需注意,这本书有点老,也有些错误(比如,有人提到它对 std::copymemmove 的说明是错的,但我已经不再有这本书了,没法确认),阅读时需要自己鉴别。但瑕不掩瑜,我还是认为这是本好书。

高级专题

Alexander A. Stepanov and Daniel E. Rose, From Mathematics to Generic Programming. Addison-Wesley, 2014
中文版:爱飞翔译《数学与泛型编程:高效编程的奥秘》。机械工业出版社,2017
推荐指数:★★★★★
Alexander Stepanov 是 STL 之父,这本书写的却不是具体的编程技巧或某个库,而是把泛型编程和抽象代数放在一起讨论了。说来惭愧,我是读了这本书之后才对群论稍稍有了点理解:之前看到的介绍材料都过于抽象,没能理解。事实上,Alexander 之前还写了一本同一题材、但使用公理推导风格的 Elements of Programming(裘宗燕译《编程原本》),那本就比较抽象艰深,从受欢迎程度上看远远不及这一本。我也只是买了放在书架上没看多少页😝。​
回到这本书本身。这本书用的编程语言是 C++,并引入了“概念”——虽然作者写这本书时并没有真正的 C++ 概念可用。书中讨论了数学、编程,还介绍了很多大数学家的生平。相对来说(尤其跟《编程原本》比),通过这本书是可以比较轻松地学习到泛型的威力的。哦,对了,我之前提到使用高精度整数算 RSA 就是拿这本书里描述的内容做练习。计算 RSA,从抽象的角度,只不过就是求幂和最大公约数而已……
除非抽象代数和模板编程你都已经了然于胸,否则这本书绝对会让你对编程的理解再上一个层次。相信我!
Andrei Alexandrescu, Modern C++ Design: Generic Programming and Design Patterns Applied. Addison-Wesley, 2001
中文版:侯捷、於春景译《C++ 设计新思维》。华中科技大学出版社,2003
推荐指数:★★★★☆
这本书算是 Andrei 的成名作了,一出版就艳惊四座。书中讨论了大量模板相关的技巧,尤其是基于策略的设计。记得在这本书出版时,大量书中的代码是不能被编译器接受的。当然,错的基本上都是编译器,而不是 Andrei。
对了,注意到英文书名中的 Modern C++ 了吗?现代 C++ 这一提法就是从他开始的,虽然那是在 C++11 发布之前十年了。可以说他倡导了新的潮流。在今天,这本书的内容当然是略老了,但它仍然是不可替代的经典作品。书里的技巧有些已经过时了(我也不推荐大家今天去使用 Loki 库),但理念没有过时,对思维的训练也仍然有意义。
Anthony Williams, C++ Concurrency in Action, 2nd ed. Manning, 2019
中文译本只有第一版,且有人评论“机器翻译的都比这个好”。因而不推荐中文版。
推荐指数:★★★★☆
C++ 在并发上出名的书似乎只此一本。这也不算奇怪:作者是 Boost.Thread 的主要作者之一,并且也直接参与了 C++ 跟线程相关的很多标准化工作;同时,这本书也非常全面,内容覆盖并发编程相关的所有主要内容,甚至包括在 Concurrency TS 里讨论的,尚未进入 C++17 标准(但应当会进入 C++20)的若干重要特性:barrier、latch 和 continuation。
除非你为一些老式的嵌入式系统开发 C++ 程序,完全不需要接触并发,否则我推荐你阅读这本书。
Ivan Čukić, Functional Programming in C++. Manning, 2019
中文版:程继洪、孙玉梅、娄山佑译《C++ 函数式编程》。机械工业出版社,2020
推荐指数:★★★★
推荐这本书我是有点私心的,毕竟我为这本书作了点小贡献,你也能在这本书里找到我的名字。因为这个,也因为这本书太新、评价太少,我也很犹豫该不该推荐。不过,鉴于在这个领域这是唯一的一本,如果你想用 C++ 语言做函数式编程的话,也没有更好的书可选了。
如果你对函数式编程有兴趣,可以读一读这本书。如果你对函数式编程不感冒,可以跳过这一本。

参考书

Bjarne Stroustrup, The C++ Programming Language, 4th ed. Addison-Wesley, 2013
中文版:王刚、杨巨峰译《C++ 程序设计语言》。机械工业出版社, 2016
推荐指数:★★★★☆
没什么可多说的,C++ 之父亲自执笔写的 C++ 语言。主要遗憾是没有覆盖 C++14/17 的内容。中文版分为两卷出版,内容实在是有点多了。不过,如果你没有看过之前的版本,并且对 C++ 已经有一定经验的话,这个新版还是会让你觉得,姜还是老的辣!
Nicolai M. Josuttis, The C++ Standard Library: A Tutorial and Reference, 2nd ed. Addison-Wesley, 2012
中文版:侯捷译《C++ 标准库》。电子工业出版社,2015
推荐指数:★★★★☆
Nicolai 写的这本经典书被人称为既完备又通俗易懂,也是殊为不易。从 C++11 的角度,这本书堪称完美。当然,超过一千页的大部头,要看完也是颇为不容易了。如果你之前没有阅读过第一版,那我也会非常推荐这一本。

C++ 的设计哲学

Bjarne Stroustrup, The Design and Evolution of C++. Addison-Wesley, 1994
中文版:裘宗燕译《C++ 语言的设计与演化》。科学出版社, 2002
推荐指数:★★★☆
这本书不是给所有的 C++ 开发者准备的。它讨论的是为什么 C++ 会成为今天(1994 年)这个样子。如果你对 C++ 的设计思想感兴趣,那这本书会比较有用些。如果你对历史不感兴趣,那这本书不看也不会有很大问题。
Bruce Eckel, Thinking in C++, Vol. 1: Introduction to Standard C++, 2nd ed. Prentice-Hall, 2000
Bruce Eckel and Chuck Allison, Thinking in C++, Vol. 2: Practical Programming. Pearson, 2003
中文版:刘宗田等译《C++ 编程思想》。机械工业出版社,2011
推荐指数:★★★
据说这套书翻译不怎么样,我没看过,不好评价。如果你英文没问题,还是看英文版吧——作者释出了英文的免费版本。这套书适合有一点编程经验的人,讲的是编程思想。推荐星级略低的原因是,书有点老,且据说存在一些错误。但 Bruce Eckel 对编程的理解非常深入,即使在 C++ 的细节上他有错误,通读此书肯定还是会对你大有益处的。

非 C++ 的经典书目

W. Richard Stevens, TCP/IP Illustrated Volume 1: The Protocols. Addison-Wesley, 1994
Gary R. Wright and W. Richard Stevens, TCP/IP Illustrated Volume 2: The Implementation. Addison-Wesley, 1995
W. Richard Stevens, TCP/IP Illustrated Volume 3: TCP for Transactions, HTTP, NNTP and the Unix Domain Protocols. Addison-Wesley 1996
中文版翻译不佳,不推荐。
推荐指数:★★★★☆
不是所有的书都是越新越好,《TCP/IP 详解》就是其中一例。W. Richard Stevens 写的卷一比后人补写的卷一第二版评价更高,就是其中一例。关于 TCP/IP 的编程,这恐怕是难以超越的经典了。不管你使用什么语言开发,如果你的工作牵涉到网络协议的话,这套书恐怕都值得一读——尤其是卷一。
W. Richard Stevens and Stephen A. Rago, Advanced Programming in the UNIX Environment, 3rd ed. Addison-Wesley, 2013
中文版: 戚正伟、张亚英、尤晋元译《UNIX 环境高级编程》。人民邮电出版社,2014
推荐指数:★★★★
从事 C/C++ 编程应当对操作系统有深入的了解,而这本书就是讨论 Unix 环境下的编程的。鉴于 Windows 下都有了 Unix 的编程环境,Unix 恐怕是开发人员必学的一课了。这本书是经典,而它的第三版至少没有损坏前两版的名声。
Erich Gamma, Richard Helm, Ralph Johson, John Vlissides, and Grady Booch, Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1994
中文版:李英军、马晓星、蔡敏、刘建中等译《设计模式》。机械工业出版社,2000
推荐指数:★★★★☆
经典就是经典,没什么可多说的。提示:如果你感觉这本书很枯燥、没用,那就等你有了更多的项目经验再回过头来看一下,也许就有了不同的体验。
Eric S. Raymond, The Art of UNIX Programming. Addison-Wesley, 2003
中文版:姜宏、何源、蔡晓骏译《UNIX 编程艺术》。电子工业出版社,2006
推荐指数:★★★★
抱歉,这仍然是一本 Unix 相关的经典。如果你对 Unix 设计哲学有兴趣的话,那这本书仍然无可替代。如果你愿意看英文的话,这本书的英文一直是有在线免费版本的。
Pete McBreen, Software Craftsmanship: The New Imperative. Addison-Wesley, 2001
中文版:熊节译《软件工艺》。人民邮电出版社,2004
推荐指数:★★★★
这本书讲的是软件开发的过程,强调的是软件开发中人的作用。相比其他的推荐书,这本要“软”不少。但不等于这本书不重要。如果你之前只关注纯技术问题的话,那现在是时间关注一下软件开发中人的问题了。
Paul Graham, Hackers & Painters: Big Ideas From The Computer Age. O’Reilly, 2008
中文版:阮一峰译《黑客与画家》。人民邮电出版社,2011
推荐指数:★★★★
这本讲的是一个更玄的问题:黑客是如何工作的。作者 Paul Graham 也是一名计算机界的大神了,用 Lisp 写出了被 Yahoo! 收购的网上商店,然后又从事风险投资,创办了著名的孵化器公司 Y Combinator。这本书是他的一本文集,讨论了黑客——即优秀程序员——的爱好、动机、工作方法等等。你可以从中学习一下,一个优秀的程序员是如何工作的,包括为什么脚本语言比静态类型语言受欢迎😁……
Robert C. Martin, Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall, 2008
中文版:韩磊译《代码整洁之道》。人民邮电出版社,2010
推荐指数:★★★★☆
Bob 大叔的书如果你之前没看过的话,这本是必看的。这本也是语言无关的,讲述的是如何写出干净的代码。有些建议初看也许有点出乎意料,但细想之下又符合常理。推荐。

其他

别忘了下面这两个重要的免费网站:
这两个网站绝对是优秀的免费资源。大力推荐!
希望今天的推荐能给你提供多一些的参考方向,从而进一步提升自己。
分享给需要的人,Ta购买本课程,你将得18
生成海报并分享

赞 26

提建议

上一篇
新春寄语 | 35年码龄程序员:人生漫长,走点弯路在所难免
下一篇
28 | Concepts:如何对模板进行约束?
 写留言

精选留言(22)

  • Geek_51b945
    2020-02-25
    老师,您觉得C++ Primer怎么样

    作者回复: C++ Primer 是本好书(但略旧)。已经读到这儿的人,不再需要 C++ Primer 了吧?

    9
  • 传说中的成大大
    2020-02-03
    老师 为什么没有推荐深度探索c++对象模型呢?我最近也在看这本书 感觉很抽象 但是感觉也成长了许多 比如 为什么空类是一个字节 比如 成员函数和普通函数的区别 再比如 对齐和补齐

    作者回复: 书还不赖,但太老,有点过时了……读读这本书肯定是有好处的,但作为通用的推荐材料,我就跳过了。 书里也有不少问题/错误。知乎上你可以找到一些勘误:很多书里的代码今天是没法编译通过的…… 在今天你可以依靠 godbolt.org、编译器的汇编生成、调试器来自己摸索,不一定需要这本书。另外,我觉得关于虚继承的内容可以跳过,除非你的项目确实需要用到。

    共 4 条评论
    6
  • 泰伦卢
    2020-01-29
    感谢感谢,这个非常好

    作者回复: 😇

    3
  • milley
    2020-02-02
    老师给的书单好多呀,C++的确是一门特性很复杂的需要,还需继续努力!老师能否讲下如何能通过开源项目学习C++呢?

    作者回复: 第23到27讲讨论的库的源代码都是可以考虑看看的。能提交几个补丁什么的就更好了。

    2
  • 心情难以平静
    2020-01-29
    数学与泛型,这个主题太好了

    作者回复: 这本在一般的C++推荐书目里通常没有,但我个人非常欣赏这本。

    共 2 条评论
    2
  • sheep
    2021-08-28
    C++函数式编程这本书非常不错,当时在学校里图书馆借到这本书,顿时就产生了浓厚的兴趣。因为一直以来在学习common lisp但是找不到好的应用场景。但是通过这本书的内容,仅仅是前几章的介绍就可以让我以函数式编程的思维去解题。同时C++又是我比较熟悉的语言,所以学起来得心应手。十分推荐想接触函数式编程又熟悉C++的同学去看。这也印证了本贾尼的那本书里说的,C++是一个多范式的语言(貌似是这个意思,不太记得了)
    展开

    作者回复: 喜欢就好,哈哈。这本书里的例子都是我校对过的。😝

    1
  • Jaime
    2021-03-14
    我觉着c++高级编程也挺不错的,最近在看这本书复习基础

    作者回复: 这本似乎之前就有人推荐的。不过,我没看过,就不能乱给别人推荐了。

    共 2 条评论
    1
  • 夜尘
    2020-02-20
    老师,有好的源码项目阅读推荐吗?

    作者回复: 还是根据你的实际使用需要吧…… 没特定需要的话,看通用的,可以考虑《STL源码剖析》、26 讲的两个日志库、libc++ 源码之类。再往下,实战篇里的那些库的源代码都可以考虑。

    2
  • ... 成
    2020-02-01
    老师觉得c++primer这本怎么样呢?

    作者回复: 书不错,但我假设看这个专栏的人不需要读这样的从头开始的教科书了。另外,这本书没有覆盖最新的现代C++的内容,也是个缺憾。

    共 2 条评论
    2
  • Geek_d6c0b4
    2022-09-22 来自上海
    c++,opencv,数据库 涉及到这三个点的,老师您有推荐的书籍吗

    作者回复: C++ 的我不写了?其他两方面我不熟。

  • 苦修者
    2022-06-13
    我看C++11之后,变量初始化的方式很混乱:可以用大括号auto a {b}; 、小括号auto a(b); 、等于号auto a=b; 。有没有一种方法,可以统一变量初始化的方式?

    作者回复: 要完全统一很难,不过我现在已经越来越多使用大括号初始化这种方式了。 参见 https://www.zhihu.com/question/509310938/answer/2354643506

    共 4 条评论
  • 苦修者
    2022-06-12
    vector<int> a(3); 和 auto a = vector<int>(3); 是完全相同初始化方式吗?两者分别调用几次构造函数?

    作者回复: C++17 或 20 里两者等效,都是调用一次构造函数。14 或更早,有可能 auto 那种形式会多产生一次移动构造。

    共 2 条评论
  • 苦修者
    2022-05-24
    吴老师,c++20 module很好用,没必要再使用#include和makefile了吧?

    作者回复: 你说了两个无关的东西,得分开讨论。 如果你的项目允许用 C++20,你的编译器支持模块也完全没有问题,你当然可以尝试全部使用模块来。不过,#include 完全消掉估计也不行。一个是标准库模块没有标准化的问题,一个是宏的问题(也许还有其他我一时没想到的问题)。比如,在 MSVC 下你已经可以使用 import std.core;(不是标准的一部分),但如果你想使用 assert 宏,你还是需要用 #include <cassert>。 makefile 关注的是构建部分。模块支持并没有解决构建问题。不管你使用什么构建工具(GNU Make 或 CMake 等等),它们都不会因为模块而消失。

    共 9 条评论
  • 苦修者
    2022-05-20
    大一小白,想学现代CPP。该看《CPP Primer》还是《C++ 语言导学》?

    作者回复: 都看。这两本书内容重叠不多,可以认为是互补的。

    共 3 条评论
  • Struggle~honor
    2022-04-02
    老师,我是Go,python工程师,7月校招入职,以后一直都写C++,从基础开始,老师觉得《C++ prime plus》怎样

    作者回复: 《C++ Primer》,不要《C++ Primer Plus》。后者据说可读性好,但内容陈旧,存在错误和过时的写法。《C++ Primer》虽然不是完美无缺,有少量内容随着标准的进展而略过时,总体来讲非常优秀。如果想从头开始好好学,就它了。

    共 2 条评论
  • 03125555
    2022-02-15
    c++并发编程实战2021年11月重新翻译出版辣!

    作者回复: 嗯,新版的翻译还是不错的。

    1
  • 2021-02-02
    请问老师,多线程这块有比较好的中文版书籍推荐吗?英文的看不懂

    作者回复: 我没有。要么你凑合看那本多线程的中文版吧……

  • TZX
    2020-10-19
    不知道为啥谷歌搜索会优先 cplusplus.com 而不是 cppreference,想把前者从我的搜索里拉黑点 🤢

    作者回复: 哈哈,心有戚戚。不过,你可以加上 site:cppreference.com 来进行限定。 Google有它自己的规则的,跟人的判断和偏好不能完全重合。

  • William~Zhang
    2020-02-22
    老师 请问如何选择项目练手?

    作者回复: 选择有兴趣的领域了。我觉得实战篇里的那些项目都可以考虑作为贡献补丁的地方。 自己也可以把平时需要写的小工具用 C++ 来写写看。解决实际问题是最好的练习方法。

  • 廖熊猫
    2020-01-29
    老师新年快乐…据说那本《编程原本》非常劝退😂放在购物车半年了都没下手买

    作者回复: 嗯,所以我没有推荐。还是看《数学与泛型编程》吧。