C++的优点自不用说,运行效率高,并且是编译性语言,运行环境易于构建。而C++毕竟是面向对象的编程语言,对于代码的可维护性和可重用性天生有优势。但C++毕竟已属老古董级的语言了,和现在主流的Java语言相比,存在的主要差距有两点:
一是面向对象的编程方法应用不够彻底,比如c++中的友元函数,多个父类的继承等,特别是那个友元函数,极大的破坏了面向对象编程的思想,在java语言中,完全看不到它的影子。奇怪的是,这个方法在很多大厂的面试题中还屡屡被提到,尽管在实际的编程中,几乎看不到。关于多个父类的继承,在实际编程中常常被用到。初版的java中并没有类似的概念,后来的java中利用interface这个东东变相引入了多个父类的继承,但以实际编程经验来看,还是不建议多个父类的继承,会破坏面向象的思想,导致代码各个功能模块之间的耦合性增加。
二就是在代码的可维护性上不足。从c++ 11开始,它已经做了许多改变,模仿了许多Java的性点。比如加入了lamda函数,明显就是仿java的interface的。变量的定义上开始推行auto类型,在内存的分配、释放上更是模仿java做了一些处理,引入了如autorelease这样的方法。这些改变有的是比较实用的,比如lamda函数(实质上还是源自c的函数指针的概念),的确是可以带来许多便利,最典型的一点就是多个软件模块都可通过一个接口函数来接收数据并将结果返回。对于一个软件模块是否接入提供了方便。其它的一些改变我认为在嵌入式开发上有点用不上,特别是auto变量,写代码的时候是方便了,但代码的可读性却大为下降,而autorelease这样的内存管理方法,隐藏了C++的内存管理上的new和delete,我认为它并没有带来如java一般方便的内存管理,还破坏了C++自身的优势,至少现阶段还不适用。
那么C++代码的可维护性体现在哪呢
一是可读性,适当的注释,这是基本的需求。没有注释的代码,连编程者本人时间一长都不记得了,也很难再解读出自已当初的构想。另外,变量和函数的起名也很重要,尽量起较长的可分类的名字,而不是一个字母的简单取名,现在C++编程环境基本都有代码的自动补全功能,长点的变量名、函数名可以几何级数的增加代码的可读性,却并不会增加多少写代码的工作量。写过java程序的都知道,java程序在发布前都需要做一下代码混淆以对代码进行保护,而混淆的过程其实就是将java代码的变量名改为一个字母的名字,将各个方法的名字也改为随机的类似abcd()这样的名字,使得混淆后的代码人类很难阅读,没法子,java做为解释语言只能这样保护自已的代码了,但也由此可知,变量名和函数名的取名是多么重要的了。
二是各功能模块文件的存贮。c++11以后,国际上有种象java一样把类中的方法都写在一个文件中的趋势,因而新版的c++也已支持这样的做法,只要你愿意,你可以把代码都写到一个头文件里。这种写法本人认为有点生搬硬套的意思,并不适合在c++上使用(个人认为把类的定义和实现代码分开存放是c++的特点,使得c++的代码易于查看),尤其不适合在嵌入式上使用,因为嵌入式开发环境可能不支持c++11或以上的新版C++,这样的做法将会导致同一段代码在不同的嵌入式设备上不能被直接编译。但我很喜欢java语言所强制要求的一个类对应一个文件的做法,在实际编写程序时,应该做到一个类对应一个hpp头文件和一个cpp文件。同样的,一个功能模块相关的类文件都应存放在一个目录下,类似于java的包文件的存贮方法,这样的做法使得功能模块文件易于拷贝应用到其它项目中。
增加可读性还有一点,那就是选择合适的代码浏览工具,win下,微软公司推出了他们自已的软件——vscode,因为本人主要是嵌入式开发,vscode没有怎么用过。在嵌入式单片机上我用的代码浏览工具主要是keil C(说实在的,keil C在代码浏览上做的并不是太好)。在嵌入式linux上我主要用的是QT5自带的QT creator,这也是Qt5开发的主界面。Qt5是目前为止,我用过的最好用的C++开发工具,win下面Qt5的主编译器mingw也是和嵌入式linux所用的主编译器gcc一脉相承,非常适合用来做嵌入式开发(在Qt Creator 可以选择用何种编译器),写用的代码基本不用变动,就可在win平台和嵌入式linux平台直接编译通过,另外,在win下的visual studio,在代码阅读方面一直做的不好,但从vs2019始,在代码阅读方面得到极大的改进,可惜它不大适于嵌入式C++开发。曾经认识一位在中兴从事嵌入式linux开发的朋友,他的主开发工具,居然只是最基本的vi编辑器,其工作效率可想而知,因为vi编辑器没有Qt那样的代码补全功能,使得他写的代码中,变量和函数名都是一两个字母的,最终的代码很难被阅读和维护。