JAVA与C++的比较网上有很多讨论。比较清晰完整的有:
http://zh.wikipedia.org/wiki/%E6%AF%94%E8%BE%83Java%E5%92%8CC%2B%2B
我无意比较哪个语言更好,只是希望总结对比一下两种语言,各自取其优点用于自己的开发中。
我认为是优点的标准是:是否能让代码更易理解,更不容易出错。至于运行效率未作为考虑因数。
1 编译与连接
1.1 导入
头文件必须要作为代码连接的“门面”好好维护 |
---|
1.2 文件
1.2.1 源代码
可以借鉴JAVA的package概念,以目录结构划分源代码。多用文件分割不同的类。 |
---|
1.2.2 库
需要注意维护.h文件和makefile文档说明,以免编译错误 |
---|
1.3 组织
每个库都提供动态和静态两种方式发布,以及足够简洁的makefile和安装脚本 |
---|
2 语法特色
2.1 const
JAVA的推荐编码实践中有一条:不得修改函数参数传入的对象,以保持对象封装的完整性。如果有const修饰符就不需要靠人工来遵守了 |
---|
2.2 默认参数
让用户可以用尽量少的参数来调用函数,是节省开发时间的重要手段,如果参数列表确实太长,考虑使用setter方法来简化对象的使用 |
---|
2.3 函数指针
现代脚本语言基本都有类似函数指针的设计,用以简化“回调”。JAVA的实现较为重型,需要仔细规划需要回调的模型 |
---|
2.4 操作符重载
JAVA可以使用接口以及实现接口的方法,来增加更多的表意,如经典的equal()方法代替==运算符 |
---|
2.5 异常
应该使用异常代替错误码返回值,而且应该通过宏功能让异常加入更多源代码信息,程序员应该强制自己处理所有的异常。 |
---|
2.6 多线程
通常并发锁是一个int或者文件,如果能与需锁对象关联起来,会让代码更易读,学习JAVA的synchonize的逻辑做法 |
---|
3 内存管理
3.1 内存回收
JAVA的对象使用起来较简单,但是没有C++的标准析构规则,对于非内存资源,需要手动关闭,要在代码文档中强调对close()方法的调用,new和close要成对使用 |
---|
3.2 基本变量类型
为了在32和64位机上通用,通常需要定义uint32_t之类的类型来统一长度 |
---|
3.3 复合变量类型
利用指针运算读写结构比较容易出错或者溢出,挨个赋值虽然笨拙却较易找到问题 |
---|
3.4 指针与句柄
严格理解按值传递和句柄的理解,严防不合理的修改类对象数据 |
---|
3.5 复制
自己定义复制细节过于繁琐,而且不正确的复制容易产生“截断”属性,不如统一用clone()方法更实用 |
---|
3.6 数组
数组常用于申请一块内存供任何用途,从而缺乏对指针的控制,应该学习JAVA的数组,严格按照声明类型使用,并且小心记录自己的长度 |
---|
4 面向对象
4.1 多重继承
大部分情况下多重继承都容易让事情变得更复杂。一般来说认为委托比继承好,多写一些代码,用纯虚类继承加上委托来处理,会让耦合度降低 |
---|
4.2 覆盖
JAVA的覆盖规则比较宽松,为了限定覆盖的扩散,应尽量收窄方法的访问权限,多用final和private,不要随便一写public |
---|
4.3 多态
C++需要额外注意需要动态绑定的时候,使用的是否引用和虚函数。 |
---|
4.4 访问权限控制
为了灵活划分代码的可耦合程度,必须善用“包”和friendly权限,减少public权限的内容 |
---|
4.5 构造器
JAVA缺乏明确的初始化个成员以及自己的语法,需要非常注意各属性的初始化写法,以防出现null句柄成员 |
---|
4.6 反射
用宏或者存储工厂函数指针的方法来实现反射,虽然麻烦但是也只能这样了 |
---|
5 API与库
5.1 标准库
统一的API库也许会丧失一定的灵活性,但是可以更好的提升代码的可读性,在学习API的使用技巧方面也能提供更大的空间 |
---|
5.2 扩展性
很多最时髦的操作系统功能,都不能做到跨平台,因此需要多多利用JNI功能,可以大大提高JAVA的工作效能 |
---|
6 模板
6.1 运行机制
JAVA编译期间并未生成新的类,但应当视之为创建了新的类,不应该大量滥用,特别是和反射混搭来使用 |
---|
6.2 算法基础
运算符的数量和意义都比较有限,适用面比较窄,还是使用扩展纯虚基类方法来为特定算法服务比较好 |
---|
最后不能免俗的总结一下:
1)编译构建部分,JAVA在易用性和规范性上完胜C++,基于VM的语言确实能让机器帮人做更多的事情
2)语法特色部分,C++从语法上实现了很多JAVA最佳实践,JAVA只在异常和多线程这类“时髦”特性上有所改进
3)内存管理各有千秋,C++更加严谨,而JAVA则更易用。C++就好像食堂吃饭,须自己交盘子,JAVA则好像饭店,有人会帮你收拾碗筷。但是JAVA如此更容易诱导程序员泄露非内存资源。
4)模板和API部分各自有优秀的地方,但是觉得模板范式C++更正宗,更能体现静态之美,JAVA只是利用动态的优势效颦了一下。
5)号称为面向对象而生的JAVA,在OO上确实得了VM动态运行的好处,但是也有很多容易诱导程序员犯错的地方,需要《最佳实践》之类的教条来自我约束。而C++则更加严格。
感谢大家的阅读,如觉得此文对你有那么一丁点的作用,麻烦动动手指转发或分享至朋友圈。如有不同意见,欢迎后台留言探讨。