最近一年里断断续续的把很久前买的《C++ Primer Plus》大致读完了。虽然大学里学过一丁点儿 C 语言,但是疏于实践,早就忘得七七八八,只对当时花了好几天饭钱买的一本红色封皮的厚厚的英文教材,以及书里令人困惑的指针引用还余有一丝丝的朦胧回忆。
至于为什么要读 C++ 的入门书呢?实在是因为一直以来感觉 C++ 是门很深奥繁杂的语言,只知道它构筑了很多系统和软件的底层实现;而自己作为前端开发,对它到底是怎么的,始终是缺乏认知。——可以说是好奇心使然吧!虽然自己的工作实际只是搬砖砌墙,但是也总想着从更底层、更深入的角度去了解软件开发和编程语言。如果不能这样,那多少总归是很遗憾的事情。
至于为什么不选择现在可能更加有前途的 Rust 或 Go 去学习呢?首先,这两个语言如果学了,感觉自己也没什么机会使用;其次,可能自己内心对 C++ 占据主导地位的图形图像学、游戏编程领域有一定的幻想吧!
语言本身给我的感受
下面总结一下学习过程中 C++ 给我的感受。
首先,诚如很多人所说,这个语言太复杂。首先概念特别多:指针,堆栈,类,运算符重载,模版,迭代器和算法等。每一个概念都能牵扯进一堆关联的问题进来,要记忆的点就特别多。从前端开发者的角度来看,JavaScript 简直是不能更友好了,语言和语法特性符合简单的思维逻辑,概念不多,无非就是一些原始类型上的坑而已。
其次,语言本身的历史包袱感觉比较严重,各标准间仿佛也不怎么一致。比如,从 C 语言里来的指针,在 C++ 里因为可能的异常导致栈上内存没被释放的问题,就得用上 auto_ptr
, shared_ptr
, weak_ptr
等;有一些旧的标准里不兼容某些算法的类型,新的标准里为了能支持到就加上了新的算法去支持等等;另外还存在不同的编译器实现的不一样的可能性,书中不少地方都会提示某些编译器实现不同需要如何处理云云,颇让人头疼——当然我只是泛泛而读,很多细节都记得不太清楚。
再次,面向对象的范式过于灵活,以至于心智负担沉重。比如继承可以支持多重继承,然后继承带来虚函数的问题,然后构造函数、析构函数、成员方法、运算符等的各种重载——在这个过程中可能会有显式(explicit)以及隐式(implicit)调用的问题,然后运算符重载可能需要声明友元,然后可能需要注意析构函数释放内存;然后可能还需要模版变量来提高抽象程度等等。感觉用它来写功能会特别的累。
总之,被前端的 JavaScript / TypeScript 的简单明了的编码宠坏之后,真的很难融入这如此复杂的世界。
对前端开发的启发
虽然以上基本都是吐槽,但是不得不说,在学习过程中,看到了很多现今编程语言的特性的身影。因此,也能大致帮助理解某些特性是如何底层实现的。