评论

收藏

[C++] 如何系统地学习 C++ 语言?

编程语言 编程语言 发布于:2021-07-05 10:26 | 阅读数:648 | 评论:0

  作者:编程指北
链接:https://www.zhihu.com/question/23447320/answer/1685865607
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


  C++ 一直是一门备受争议的语言,关于 C++ 的书籍也是浩瀚如海。
  C++ 最大的缺点就是语法复杂,而且难学难精。
  侯捷老师说:
C++的难学,不仅在其广博的语法、语法背后的语义、语义背后的深沉思维、深层思维背后的对象模型;
C++的难学还在于它提供了 4 种不同(相辅相成)的编程思维模型 :
Procedural-based,object-based, object-oriented, generic paradigm。
  学习 C 语言也许一本 K&R 的《C程序设计语言》就够了,但是在 C++ 世界里,找不到这样一本书。
  这是一个爱速成的年代,大多数人很难耐得住寂寞花很长时间去学习一门语言,所以《21天学通C++》的销量还蛮不错的。
  但是学习就是要看大量的经典书和写代码实践,在这送大家一份我大学期间整理的计算机经典书籍,这些书大家可以在这里获取,对于学习计算机的同学帮助非常大,且十分系统
DSC0000.jpeg

  书单:
计算机必看经典书单(含下载方式)​mp.weixin.qq.com DSC0001.jpg   但是很遗憾,别说 21 天,就是一两年也很难精通 C++ 。
  学好过程,一定离不开读大量的书籍甚至标准库文档,
  正如侯捷老师所说C++ 相关的书籍也非常多,如天上繁星。 广博如四库全书者有 《The C++Programming Language》 《C++ Primer》,深奥如山重水复者有《The Annotated C++ Reference Manual》、《Inside The C++ Object Model》,细说历史者有《The Design And Evolution Of C++》、《Rumiations on C++》,独沽一味者有《Polymorphism in C++》、《Genericity in C++》,独树一帜者有《Design Patterns》、《C++ FAQs》,程序库大全有之《The C++ Standard Library》.....
  至于书单的话,可以看下这个C++ 最全书单,包含几十本经典的PDF和下载方式:
C++ 必读书籍推荐(含下载方式)​mp.weixin.qq.com DSC0002.jpeg   在这里,我也把 C++ 学习初略的分为几个层次,并且提供一些参考学习路线给大家:
一、入门
  如果你之前没有 C 或者其它语言的基础,我建议看看网上的 C++ 入门教程,比如菜鸟教程、C 语言中文网上面。
  这个过程你需要了解并且掌握所有编程语言中共同的、最基本的那些概念:
  变量、常量、类型、循环、判断、数组、字符串、对象、输入输出等
  然后还有 C++ 中一些特有的东西,比如命名空间 namespace、引用、模板等。
  以及如何使用一些 STL 中的类库,比如 string、vector、find 之类的东西。
  然后就是辅以大量的练习。
  就那种 C++ 教程的课后练习题就足够了,类似水仙花数、四则运算计算器之类的东西。
  如果对这些没什么兴趣,可以试试这个网站,
Kata | Codewars​www.codewars.com DSC0003.jpeg   有点像 LeetCode 刷算法题一样,这里针对每一个语法知识点都有一系列的练习题可供选择。
  而且不仅包含 C++,其它几乎所有语言都可以在这里进行练习:
DSC0004.jpeg

  应该两三周就能过完菜鸟教程这种级别的指引吧。
  到这里,你对 C++ 包含了哪些知识点大概有了一个整体的印象。
  并且能够写上百行左右的程序,但是还是很难写出一个优秀的类。
  接下来需要进行全面和深入的学习,算是真正的入门:

  • 《Accelerated C++》(美国斯坦福大学的经典教材)
  • 《C++ Primer》(大而全)
  • 《The C++ Programming Language》(C++之父 Bjarne Stroustrup 所著)
  这三本,其实各有优缺点,第一本优点是简短,仅仅两三百页,只有最为核心和主干的知识点。
  而后两本则都是大而全,尤其是《The C++ Programming Language》。
  这两本区别在于,一个是 C++ 大师所著,一本是 C++ 之父所著。
  网上有人说 《C++Primer》是目前市面上唯一一本真正的从入门到精通的书,适合初学者;
  《C++ Programming language》 是C++专家自学指南,顾名思义,适合有较深厚 C++ 功底的读者。
  所以我推荐的顺序是:
  《Accelerated C++》->《C++ Primer》->《The C++ Programming Language》
  对于这种上前页大部头我推荐的阅读方式是,以主题为划分,比如 C++ Primer 就明确的分为了:

  • C++ 基础
  • C++ 标准库
  • 类设计者的工具
  • 高级主题
  如果有一定的基础的话,可以看着目录,看一些自己感兴趣的章节,完全没有必要从第一页开始挨着挨着读。
  入门结束你应该掌握以下内容:

  • 基础语言
  • 类与面向对象
  • 输入输出
  • 字符串处理(类库和正则表达式)
  • 容器类库
  • 泛型算法
  看着只有几个关键字,实际上每个展开都有很多内容需要学习。
  学习过程中把后面的每一个练习题都自己敲一遍,自己多思考对比一下。
  多用代码去验证自己的想法,尤其是指针、引用、构造、析构这些地方。
  学习 C++ 以及日常开发一定要记得这几个网站,可以随时查阅一些语法的用法和标准库:

  • cppreference
  • cplusplus
  • isocpp
二、提高
  看完 C++ Primer 这类书,写出来的代码在效率、规范上还是没那么 “C++”。
  甚至会有内存方面的 Bug。
  比如返回函数内局部变量的引用,经常 pass-by-value 而非 pass-by-reference-to-const。
  由于 C++ 是一门系统级编程的语言,你需要掌握一些 OS 方面的知识才能更好的使用。
  尤其是内存编译链接这一块,比如堆、栈、静态链接、动态链接等等。
  还有一些 C++ 里比较特殊的概念,比如 RAII 的资源管理方式、值语义与生命期、引用、右值引用等等。
  这些东西似乎没有一本很系统的书籍可以帮助你掌握,只能在不同的书里吸收完善。
  这一块,我也在路上。
  这里给出一些在这些方面有帮助的书籍:

  • 《Effective C++》
一言概括,就是帮助你快速习得一些 C++ 里正确的姿势。
否则你可能需要用几万行代码的经验才能慢慢悟出来。


  • 《程序员自我修养》& 《CSAPP》
帮助你掌握一些系统级编程的知识。 如内存管理、堆栈、链接这类在 C、C++ 中极其重要的概念。


  • 《Linux多线程服务端编程》
这本书严格来说不是纯讲 C++ 的。
但是里面会有一些章节,关于 C++ 多线程编程、锁、线程安全、C++ 一些工程实践经验还不错。


  • 《Google C++ Style Guide》
Google的C++ 代码规范,写代码是一件专业的事,把代码写得漂亮、专业也是一项能力。
Google的代码规范算是 C++ 领域一个标杆了。
  鹅厂很多代码规范也是基于Google的代码规范做了一些适应性的改进。
  在学习编程之初就掌握良好的编码规范大有裨益。
三、进阶
  上面提到的这些书重点在于如何使用、用好 C++ 这一个范畴。
  而进阶,我认为则是研究语言一些 case 的具体实现,深刻的思考语言设计和演进本身。
  这里分为三个部分:
Part1. STL 源码
  侯捷老师说:源码之下,了无秘密。
  为了更好的使用 STL,一个方法就是阅读 STL 源码 或者掌握部分实现:
  《STL源码剖析》
这本书讲解了 STL 五大组件的底层实现。
包括内存管理、各类容器的数据结构实现、算法的实现等。
建议列为必读,可以帮助深入理解 STL 底层。
其中也有很多面试常考的知识点,如内存池、traits 技法、vector 动态扩容、set、map 等实现原理等。
Part2. 对象模型
  《深度探索C++对象模型》
这本书其实就是围绕一个点:C++ 里的对象是在内存中是如何组织的。
  这是每个章节内容:

  • 关于对象
  • 构造函数语意学
  • Data语意学
  • Function语意学
  • 构造、解构、拷贝语意学
  • 执行期语意学
  我第一次看见这本书就被深深的吸引了,当时在学校,每天看八九个小时,花了大概一周刷完了。
  看完这本书感觉自己对于 C++ 的底层实现机制有了更深的理解。
  比如多重继承、菱形继承、虚函数底层的实现机制等等。
  当然了,也有人会认为对象如何在底层实现属于 C++ 编译器实现细节,而非语言标准,不应该以实现细节倒推标准。
  诚然如此,掌握实现细节还是会对你理解 C++ 有促进作用。
Part3. 语言设计与演化
  这里重点是思考 C++ 语言很多语法的设计和演进方向,可以看看 C++ 之父 Bjarne Stroustrup's FAQ、《C++设计与演化》。
  设计与演化这本书重点在于通过 C++ 之父去窥见 C++ 的前世今生。
  看完这本书的意义,功利一点来说,或许对于提高 C++ 编程能力没有太多帮助的,不像 Effective 是立竿见影的效果。
  但是,对于加深对 C++ 的理解很有帮助。
  想要更好的使用 C++ 构建好的、高效的系统,对语言本身的深入理解是先决条件。
  另一方面,书中提到了很多语言设计的思想、哲学,这些,相信在学习其他编程语言的时候也是有帮助的。
Part4. Template Metaprograms
  // TODO
四、关于书单
  这篇文章中对于书籍,我的一个原则就是能省则省,因为 C++ 相关的优秀书籍实在太多了,我只想挑出每个阶段最有用的的书。
  书不在多,贵在精。
  看书也是一样的,我推荐书不一定都需要去看完,深入细致的阅读完一本技术书比走马观花似的阅读 N 本更有效。
  当然了,后面我也会推出一份分门别类整理后的 C++ 书单供大家索引。
四、关于视频
  对于初学者来说看书也许确实很难 get 到那个点,就像我大一看 C 语言的教材里说文件分为文本流文件和二进制流文件,当时我愣是理解不了。
  很多对于会的人是常识的东西,对于初学者就是无法理解、很难的概念。
  那也许通过别人讲授、视频的方式会更容易入门一点,这里推荐浙大翁凯的 C++ 视频。
  翁凯老师无论是 C、C++、Java 的视频都讲得非常深入浅出,只能说水平越是高的人讲的课越容易明白。
  这是网易云课堂地址:
面向对象程序设计-C++ - 网易云课堂​study.163.com  另外还要推荐侯捷老师的一些列课程:
DSC0005.jpeg

  我当时看见这些标题:《内存管理》、《C++11》、《STL源码分析》......
  简直如获至宝一样,一个寒假就把这些视频全看完了,对于 C++ 和内存管理方面理解提高了很多。
  这里列举几个吧:
  侯捷C++新标准-C++11/14
【高清版】侯捷C++新标准-C++11/14_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com DSC0006.jpeg   侯捷-C++程序的生前和死后
【高清完整版】侯捷-C++程序的生前和死后_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com DSC0007.jpeg   侯捷-C++ STL标准库和 C++ 泛型编程
【高清完整版】侯捷-C++ STL标准库和 C++ 泛型编程_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com DSC0008.jpeg   真的非常感谢 B 站、感谢这些讲师和分享者,甚至要感谢互联网时代!
  (PS:侯捷 C++ 视频课程一直都被看过的同学广为推荐,最近发现 B 站关于侯捷老师的 C++ 视频课程几乎全部被下架了,于是自己搜集了一套非常全的视频,大家赶紧去下载保存备用:
侯捷C++全套视频|含下载方式​mp.weixin.qq.com  他们让知识的传播变得更加的便捷,降低了后来者的学习门槛,当然啦也变相加重了内卷化hahah(逃
  还有一个我最近发现的一个视频,是一个国外 C++ 游戏引擎开发工程师录制的一套偏向 talk 类型的教程,比较通俗易懂和深入浅出,
  推荐一下:
[中英字幕] C++_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com DSC0009.jpeg DSC00010.jpeg END
  送给学习 C++ 的同学一段翁凯老师讲课说的话:
学 C++ (计算机)一定要有一个非常强大的心理状态
什么呢
C++ (计算机)的所有东西都是人做出来的,别人能想出来的我也一定想得出来,在 C++(计算机)里头没有任何黑魔法,所有的东西只不过是我现在不知道而已
总有一天我会把它里面的细节搞明白的!
  另外,在这里也送大家一本帮助我拿到BAT 等一线大厂 offer 的算法笔记,是一位阿里大神写的,对于算法薄弱或者需要提高的同学都十分受用,算法一定是计算机学习的重中之重:
阿里大神的leetcode刷题笔记,看完秒杀80%的题目​mp.weixin.qq.com  觉得不错的话,记得关注我
  @编程指北
  

  
关注下面的标签,发现更多相似文章