C/C++ 是一门底层、细粒度、功能强大、学习曲线陡峭的语言,虽然在Python等新语言的冲击下略显龙钟老态,但随着AIoT设备的兴起,以及C++社区不断推出新的版本,这门语言又重新焕发了生机。
本文把C++学习划分为入门、熟练、进阶三个阶段,每步提供相应的学习方法和资源,并归纳了每部分需要掌握的知识点供大家复习自检,希望能够帮助大家更好地掌握这门语言。也欢迎大家告诉我更好的学习资源,本文会不断更新来帮助更多的人。
入门(塑料→青铜→白银)
学习新知识有两个关键:快速上手、完整的知识体系,两者缺一不可:上手慢就会打击初学者的积极性,产生劝退效应;而没有完整的知识体系,初学者就是盲人摸象,想要进阶深入就变得困难重重,只会长期停留在入门阶段。我在对比多种学习方法后,认为网课是能够兼容这两点的好方法,所以这部分主要推荐网课,通过高频且较简单的练习巩固知识,符合人的认知曲线,提高学习效率。
1. 语言本身(入门)
C++ 和 C 是不同的语言,但两者通常放在一起学习,C++完全兼容C的特性,并在C基础上加入了面向对象的特性,可以视为 C 语言的升级版,C能做到的事情 C++ 一样可以做到,C 做不到的事情 C++ 也可做到。
初学C++我推荐学堂在线上清华大学郑莉老师的课程:C++语言程序设计基础,C++语言程序设计进阶。在讲课过程中会有弹出的选择、填空题来巩固知识点,每一章结束一般会有三道编程题来进行练习。通过高频且难度不大的练习,将陡峭的学习曲线拉平,进度页面可以看到学习完成的进度,带给大家成就感。我把自己学这门课时的课后习题放在Github上C++语言程序设计课后习题,供大家参考。学完这门课程就会对C++的特性有了整体的了解,并且能够上手编写一些简单的程序,这时候可以去LeetCode 上刷一些 Easy 题目找找存在感了。
这部分主要掌握的知识点是:
- 基础语法:变量、条件、循环、字符串、数组、函数
- 指针操作、内存管理:这两项是C/C++的灵魂,是这门语言经久不衰的关键,但这也是一把双刃剑,用的好可以极大提高程序运行的速率,用不好会导致内存泄漏甚至程序崩溃
- 面向对象编程:类的定义与使用,继承与派生,这项特性保证了代码良好的复用和封装,是大型项目开发的必备因素
掌握编程语言后,就要跟操作系统打交道了。
2. 应用实践(入门)
Windows 和 Ubuntu 是操作系统的两大阵营,大家可以根据自己的需求进行选择。在Windows下编程的同学可以跳过这个部分,因为Visual Studio (Community社区版) 功能已经足够强大,不需要进行任何配置上手即用,关键还是免费的!这里说一声微软牛[哔——]。
如果需要在Linux 下编程的同学,我推荐学堂在线上清华大学乔林老师的课程:基于Linux的C++。学过郑莉老师的C++,乔林老师的这门课程就没有必要全部看下来了,因为前11讲内容都是在重复C++的语言特性,大家只要关注12讲的内容:Linux系统编程基础,系统性的了解 Linux 下编程的特点。后面三章感兴趣的话也可看一看:13.进程编程,14.线程编程,15.网络编程,但不学也不会有什么问题。
这门课程的用户体验没有郑莉老师的课程那么友好,不过用来系统性掌握Linux系统下的编程操作已经足够了。乔林老师讲解并不详细,但胜在体系完整,能够用很短的篇幅帮初学者建立对 Linux 系统完整的认知,这是我推荐这门课程的原因。因为讲解不够详细,遇到不懂问题再配合搜索引擎进行学习吧。
这部分主要掌握的知识点是:
- 操作系统下软件的编译与执行:编译器、makefile
- 常用的系统调用:system, getenv
3. 软件设计(入门)
算法与数据结构、计算机网络、操作系统,是计算机考研必备的三门课程,也是整个计算机的基石。修炼好这三部分知识的程序员就像掌握了深厚的内功,无论是学习其他语言还是进行架构设计,都会更加得心应手,事半功倍。
3.1 算法与数据结构
入门阶段不需要花费大量的精力对多种多样的算法和数据结构进行详尽的了解,但是需要掌握进本的算法分析手段,以及算法研究需要解决的问题。这里推荐学堂在线上清华大学邓俊辉老师的课程:数据结构(上),只需要学习第一章绪论部分就可以。后续的章节可以在深入阶段再进行深挖。
需要掌握的知识点:
- 使用大O记号对算法的复杂度进行分析。
3.2 计算机网络
对于入门而言,这部分内容完全可以略过。只要实践中不涉及网络编程,就可以暂时不做了解。如果需要了解的话,首先应该掌握TCP/IP的五层网络结构,当遇到网络问题时,能够快速定位是哪一层出了问题,然后快速排查。
知识要点:
- TCP/IP五层网络结构
- 常用传输层协议:TCP UDP
- 常用应用层协议:HTTP
3.3 操作系统
这里并不需要对操作系统有多么深入的了解,只需要对计算机的硬件结构有初步的认识,了解程序从编译到执行的具体过程,了解堆栈的概念以及函数调用等流程。这部分内容不需要专门学习,我建议在学习C++语言的过程中,参考教材《C++程序设计》(Y.Daniel Liang),这本书中对操作系统有简单的介绍,可以在学习过程中加以了解。刚开始没看懂也没有关系,等语言学一段时间再回来看,相信会有更深的理解。
知识要点:
- 计算机体系结构:CPU,内存,硬盘,I/O设备
- 内存堆栈与函数调用的关系
- 程序编译的流程:编辑→编译→链接→执行