这门古老的语言,是上个世纪80年代贝尔实验室基于C语言改进而来,已经有40多年历史,如果算上C语言的起源那就更悠久了。
任何一种历史厚重的文化理解起来都不太容易,从C++身上,能看到计算机语言进化的影子。
C++语法几乎涵盖市面上所有其他语言支持的语法,别人有的它有,别人没有的它也有,有太多细节值得探讨。举几个例子感受下。
下面例子中,c2.func(c1)调用了c1的private re、im,但是可以成功执行,why?
1)C++规定声明为友元的函数,可以访问private类型的成员属性。 2)相同class的各个objects互为friends。 理解这段代码,需要知道这两个细节。
重载是C++里很重要的语法,包括函数重载、运算符重载。
问题:关键字 new delete能重载吗?重载的机制是什么?有重载实现,我能不能调用默认的实现?
new delete关键字是可以重载的,分全局重载和类范围重载,上面这个例子演示的是类范围重载。重载后编译器会优先使用你重载的实现。还有很多细节,后续的文章会详细展开。
一个函数传参有三种方式,传值、传指针*、传引用&,这三种方式有什么区别?
再进一步,灵魂拷问,java里传参是传值,还是引用&,还是指针?
c++的函数调用在编译阶段会替换成具体的函数地址,这个过程叫binding(绑定),绑定又分动态绑定和静态绑定。
什么是虚指针、虚函数表?动态绑定和静态绑定的区别是什么?如果不了解,可以先跳过,带着问题,读我后续的文章,限于篇幅此处不做展开。
c/c++语言需要开发者自己管理内存,稍不留神就容易内存泄漏,除此之外,你可能还需要理解内存的计算。
灵魂拷问: 1)有继承关系的对象,内存如何分配? 2)虚函数的内存如何分布? 3)debug模式下内存的分布一样吗? 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++新版本的特性。
可以看到c++开发者对新特性的拥抱热情。
随着c++使用的深入,后续每一个模块你都需要花时间系统性的学习,而不是简单的google/baidu一下就能掌握。
后续文章中,我会将这几块学习笔记及心得整理出来。
上面讲c++的复杂性,是希望读者对c++的难度有个感性的认识。世上事有难易乎?为之则难者亦易矣!
面向初学者的教材,合适最好。
c++入门书籍最经典的当属 c++ primer
可以买一本当字典用,但是我不推荐这本作为入门教材,篇幅浩大,内容细致,很容易打击读者。
这里推荐21天精通c++,语法精简,每一个语法有完整的demo实例,方便读者跟着敲一遍,非常适合入门。
网上有"免费"的pdf,大家可以找找。
有杠精会说,最好读官方文档。不是每个开发者都有很好的英文水平,就不要强迫自己去读官方文档了,务实点,合适最好。
推荐这个开源项目,都是cmake最基础的用法,而且都有实际的代码案例,跟着操作一遍即可。作者编排的非常用心。
再推荐一份 cmake-practice,也是偏重实践
当你在实际的工程中实践一段时间之后,再回过头来深入学习。
推荐学习侯捷前辈的课程,因为版权的问题很多网站上都下线了,这里贴几个youtube的地址和网盘链接
https://www.youtube.com/playlist?list=PLARyLAkGMq_7_qm4gPZ0OvfqfQrvkFVMw
https://www.youtube.com/watch?v=N27j6snKcxI&list=PLTcwR9j5y6W2eH37R2_4oEO4Y0tksot56
https://www.youtube.com/watch?v=Edcwv38c7d4&list=PLTcwR9j5y6W2Bf4S-qi0HBQlHXQVFoJrP
https://www.youtube.com/watch?v=TJIb9TGfDIw&list=PL-X74YXt4LVYo_bk-jHMV5T3LHRYRbZoH
https://www.youtube.com/playlist?list=PLJlgxk8narLfStNCt5utxgBDCxv5p6Ejq
网盘链接: https://pan.baidu.com/s/16NVyr20p8Kcly2V6kB9aPw 密码: uflr
后续,我会持续把自己的学习内容整理出来。如果对你有帮助,点个再看吧~~