c++应该怎么学

467 阅读5分钟

欢迎关注公众号:sumsmile, 图像视觉、移动开发~~

笔者从去年开始使用C++进行开发,这篇文章站在初学者的角度,总结零基础应该如何学习这门语言。

C++为什么难学

这门古老的语言,是上个世纪80年代贝尔实验室基于C语言改进而来,已经有40多年历史,如果算上C语言的起源那就更悠久了。

任何一种历史厚重的文化理解起来都不太容易,从C++身上,能看到计算机语言进化的影子。

纷繁灵活的语法

C++语法几乎涵盖市面上所有其他语言支持的语法,别人有的它有,别人没有的它也有,有太多细节值得探讨。举几个例子感受下。

例1:

下面例子中,c2.func(c1)调用了c1的private re、im,但是可以成功执行,why?

1)C++规定声明为友元的函数,可以访问private类型的成员属性。
2)相同class的各个objects互为friends。
理解这段代码,需要知道这两个细节。

例2

重载是C++里很重要的语法,包括函数重载、运算符重载。

问题:关键字 new delete能重载吗?重载的机制是什么?有重载实现,我能不能调用默认的实现?

new delete关键字是可以重载的,分全局重载和类范围重载,上面这个例子演示的是类范围重载。重载后编译器会优先使用你重载的实现。还有很多细节,后续的文章会详细展开。

例3

一个函数传参有三种方式,传值、传指针*、传引用&,这三种方式有什么区别?

再进一步,灵魂拷问,java里传参是传值,还是引用&,还是指针?

对象模型

c++的函数调用在编译阶段会替换成具体的函数地址,这个过程叫binding(绑定),绑定又分动态绑定和静态绑定。

什么是虚指针、虚函数表?动态绑定和静态绑定的区别是什么?如果不了解,可以先跳过,带着问题,读我后续的文章,限于篇幅此处不做展开。

内存管理

c/c++语言需要开发者自己管理内存,稍不留神就容易内存泄漏,除此之外,你可能还需要理解内存的计算。

灵魂拷问:
1)有继承关系的对象,内存如何分配?
2)虚函数的内存如何分布?
3)debug模式下内存的分布一样吗?
4)每个编译器对内存的处理是一样吗?

例4

一个complex类,有两个double字段

上图左边呈现的是debug模式下的内存。1) 一个double占4个字节,complex有两个double占8字节
2)数组长度为3,即8 * 3
3)debug信息需要 32 + 4字节
4)开头和结尾各1个字节标识符 4 * 2
5)内存对齐,内存必须以16的倍数来分配,72 --> 80

所以最终的内存分配是80字节

编译(cmake)、stl、c++新特性

此外,你还需要理解编译,熟练掌握cmake以组织工程中的各个模块,以及深入学习stl和c++新版本的特性。

可以看到c++开发者对新特性的拥抱热情。

随着c++使用的深入,后续每一个模块你都需要花时间系统性的学习,而不是简单的google/baidu一下就能掌握。

后续文章中,我会将这几块学习笔记及心得整理出来。

正确的学习姿势

上面讲c++的复杂性,是希望读者对c++的难度有个感性的认识。世上事有难易乎?为之则难者亦易矣!

  1. 选择合适的教材,不要上来就啃大部头
  2. 不要妄图一次性掌握这门语言,先学最少依赖的语法部分
  3. 多动手实践,在coding中理解语言的细节
  4. 入门之后,带着问题继续深入学习

资料推荐

面向初学者的教材,合适最好。

c++ 入门书籍

c++入门书籍最经典的当属 c++ primer

可以买一本当字典用,但是我不推荐这本作为入门教材,篇幅浩大,内容细致,很容易打击读者。

这里推荐21天精通c++,语法精简,每一个语法有完整的demo实例,方便读者跟着敲一遍,非常适合入门。

网上有"免费"的pdf,大家可以找找。

cmake教程

有杠精会说,最好读官方文档。不是每个开发者都有很好的英文水平,就不要强迫自己去读官方文档了,务实点,合适最好。

推荐这个开源项目,都是cmake最基础的用法,而且都有实际的代码案例,跟着操作一遍即可。作者编排的非常用心。

再推荐一份 cmake-practice,也是偏重实践

深入学习

当你在实际的工程中实践一段时间之后,再回过头来深入学习。

推荐学习侯捷前辈的课程,因为版权的问题很多网站上都下线了,这里贴几个youtube的地址和网盘链接

  • C++面向对象高级编程(侯捷)

www.youtube.com/playlist?li…

  • C++内存管理 | 侯捷

www.youtube.com/watch?v=N27…

  • STL | 侯捷

www.youtube.com/watch?v=Edc…

  • 侯捷——C++11新特性

www.youtube.com/watch?v=TJI…

  • 侯捷 C++ Startup 揭密:C++ 程序的生前和死后

www.youtube.com/playlist?li…

网盘链接: pan.baidu.com/s/16NVyr20p…  密码: uflr

后续

后续,我会持续把自己的学习内容整理出来。如果对你有帮助,点个再看吧~~