class="MsoNormal">C++与java对比
大一到大三,我课外课内使用过很多语言,大一是c++,紧接着是java、php,再后来是python,天下语言都是相通的,不过每个程序员都应该掌握一个最称手的兵器,java虽然成熟通用却不高效,php开发网站方便但同样不高效,唯有两个语言可以入我的法眼:python和c++,python方面快捷,开发效率高,好用。C++效率高,我感兴趣的方向是数据挖掘,以后也希望做一个后台程序员,也许c++会用的比较多,而且我心目中的理想公司也在大范围使用。因此决定重新拾起。
可是c++并不是我使用最多的语言,我使用最多的语言是java,为了梳理思路和方便以后的学习,我决定整理出他们的区别,并罗列出更多c++的优势
以下内容来自互联网,由作者整理
资料一:C++ 和java有什么区别:
1. ? ? Java中对内存的分配是动态的:(java拥有智能的垃圾回收机制,可以避免很多错误,因为管理员不必关心内存问题,而c++则采用new、delete来手动分配释放内存)
2. ? ? Java不在所有类之外定义全局变量:(java不在类的外部定义,而是在类的内部使用静态变量)
3. ? ? Java不用goto语句
4. ? ? Java不支持头文件
5. ? ? Java不支持宏定义,而是使用final
6. ? ? Java对每种数据类型都分配固定长度:在java中,int固定32位,c++在不同的平台上长度不同,同样是int类型,在PC机中为二字节即16位,而在VAX-11中,则为32位.这使得C语言造成不可移植性,而Java则具有跨平台性(平台无关性).
7. ? ? 类型转换不同:在C和C++中,可通过指针进行任意的类型转换,常常带来不安全性,而在Java中,运行时系统对对象的处理要进行类型相容性检查,以防止不安全的转换.
8. ? ? 结构和联合的处理
9. ? ? Java不再使用指针:指针是C和C++中最灵活,也最容易产生错误的数据类型.由指针所进行的内存地址操作常会造成不可预知的错误,同时通过指针对某个内存地址进行显式类型转换后,可以访问一个C++中的私有成员,从而破坏安全性.而Java对指针进行完全地控制,程序员不能直接进行任何指针操作。
(以上内容来自:http://jingyan.baidu.com/article/fea4511aa1fd0bf7ba912575.html).
基本上这些资料都是向着java来写的,感觉也有些主观。感觉是在写java的优势,它是从编程的角度去分析的,而下面这个资料,则是从应用方面去分析各自的优势:
? Tips:
宏定义:宏定义是C语言提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。
例:
#define Pi 3.1415926
把程序中出现的Pi全部换成3.1415926
具体可看:(http://baike.baidu.com/view/2076445.htm)
?
指针(这个内容比较多也比较重要,所以请看专题博客):
?
资料二:
Java开发的最初目的是Web,C++则主要是针对应用软件。所以Java在网络编程中比C++更具有先天的优势,这主要考虑到了Java的高可移植性和易开发性,目前常说的JavaEE就主要是这方面的了。而C++也不是不能够进行网络编程,不过他需要的代价实在太高了,还有移植性和安全性的问题需要考虑,开发效率较低。但在那些系统编程和驱动编程中,则更多的使用C/C++了,这时需要与硬件打交道,Java就不行了,Java还有性能上的先天缺陷(不过现在很多好的Java解释器的优化策略非常好,不过就牺牲了可移植性),C/C++充分利用硬件优势发挥其高效的性能,而且Java能做的,C++几乎都能够做到,反之不然。而且目前绝大数的大型的网络游戏都是C++开发的,3D游戏则更不用说了。但C++的学习曲线远远陡于Java,想擅长精通C++不是简单的事。
http://bbs.csdn.net/topics/310009848
这个说了很多,主要的的几点可罗列为:
1. ? ? Java开发最初的目的是web,c++则主要是针对应用软件。
2. ? ? Java有高可移植性和易开发性
3. ? ? Java更适合网络编程,c++代价高且移植性和安全性问题难解决
4. ? ? c/c++适合系统编程和驱动编程,java有性能上的先天缺陷
5. ? ? c++的学习曲线远远陡于java
?
这些都说得很有道理,然而比较全面系统的介绍应该是我在维基百科里看到的解释,太多了,给大家链接感兴趣可以自己去看哈(http://zh.wikipedia.org/wiki/Java和C%2B%2B的對照),我只罗列出部分不错的:
C++
可选的自动边界检查. (例如: vector 和 string 这两个容器的 at() 方法)
一次编写多处编译
大部分运算符可以运算符重载
Java
?
一般都有做边界检查。HotSpot (java)(Sun 的虚拟机实现) 可以去掉边界检查
?
一次编写多处运行
?
运算符的意义一般来说是不可变的,例外是 + 和 += 运算符被字符串重载了
C++库包括:语言支持,诊断工具,常用工具,字符串,本地化,容器,算法,迭代器,数值,输入/输出,C库。Boost库提供了更多的功能,包括线程和网络I/O。用户必须在一大堆(大部分互相不兼容)第三方GUI或者其他功能库中进行选择
库在每次 Java 发布新版本的时候都会更新并增强功能。1.6版本支持:本地化,日志系统,容器和迭代器,算法,GUI 程序设计(但没有用到系统的GUI),图形,多线程,网络,平台安全,自省机制,动态类加载,阻塞和非阻塞的I/O,对于XML、XSLT、MIDI也提供了相关接口或者支持类,数据库,命名服务(例如 LDAP),密码学,安全服务(例如Kerberos),打印服务,WEB 服务。SWT 提供了一个系统相关的GUI的抽象
Tips:
一次编写多处编译:一次编写,到处编译(“Write once, compile anywhere”,简写为WOCA)是一种编写跨平台计算机程序的哲学,旨在让计算机程序能够在不同的系统平台上编译而不必修改其源代码。和太阳微系统公司的“一次编写,到处运行”口号不同,这种跨平台特性体现在源码层面上,而非字节码层面。
一次编写到处运行:一次编写,到处运行(Write once, run anywhere、WORA,有时也作“write once, run everywhere”、WORE),是太阳计算机系统公司用来展示Java程序设计语言的跨平台特性的口号。理想中,这意味着Java可以在任何设备上开发,编译成一段标准的字节码并且可以在任何安装有Java虚拟机(JVM)的设备上运行。
边界检查:在程序设计中是指在使用某一个变量前,用来检查该变量是否处在一个特定范围之内的过程。最常见的是数组的下标检查,来防止下标超出数组的范围而覆盖其他的数据。
若是边界检查未能发现错误,最常见的结果是程序出现异常并终止运行,但也可能出现其他的现象。
由于每次都进行边界检查非常耗时,而且有些代码是不可能产生越界的问题的,所以这个操作并不总是需要被执行。一些现代的编译器中有被称为选择性边界检查的技术可以略去一些常见的不需要的边界检查来提高程序的性能。
?
小结:其实java和c++各有优势,java的优势在于它的跨平台性,更适合网络编程,同时垃圾回收机制,指针封装,强制面向对象也让它的学习成本较C++小很多,对于运行效率有要求的情况下,C++仍然是非常不错的选择。