c c++和Java的比较
2012年06月28日,我参加了中软的培训的摸底测试。
其中有一题目:“列举Java与C++语言的不同之处(至少5点)”。
我答案中写了:“C++是面向过程语言而Java是面积对象语言。”
回来之后查了下资料才知道自己对Java、C、C++的理解并不多。于是再次把C、C++、Java的关系总结一下。
C
既具有高级语言的特点,又具有汇编语言的特点。由美国贝尔研究所的D.M.Ritchie于1972年推出。可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
- C是高级语言,它把高级语言的基本结构和语句与低级语言的实用性结合起来。可以像汇编一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
- C是结构式语言。结构式语言的显著特点是代码及结构的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数的形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
- C语言功能齐全。具有各种各校的数据类型,并引入了指针的概念。
- C语言对编写需要硬件进行操作的场合,明显优于其它高级语言。
- 缺点:
a) 数据封闭性不好,安全性上有很大缺陷。
b) 语法限制不太严格,对变量的类型结束不太严格,影响程序的安全性,对数组下标越界不作检查等,从应用的角度,C比其它高级语言较难掌握。
C++
中国大陆的程序员通常读:C加加,西方程序员通常读做:C plus plus, CPP.
C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。
- C子语言。C++支持C语言的几乎全部功能,主要是c89的部分,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C++标准文献)。
- 面向对象的C++语言。C++语言原本不具备面向对象的设计功能,然而随着面向对象编程的概念的提出以及如Java等语言的发展成熟,C++语言也开发出了支持面向对象功能的版本。
- 泛型编程语言。C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。
- STL(C++标准模板库,Standard Template Library)。随着STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的native代码低些,但是其安全性与规范性使它大受欢迎。
- C++在一定程度上可以和C语言很好的结合,甚至目前大多数C语言程序是在C++的集成开发环境中完成的。C++相对众多的面向对象的语言,具有相当高的性能。 C++引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括MFC、QT、wxWidgets就是使用的C++。
- 缺点:C++由于语言本身过度复杂,这甚至使人类难于理解其语义。更为糟糕的是C++的编译系统受到C++的复杂性的影响,非常难于编写,即使能够使用的编译器也存在了大量的问题,这些问题大多难于被发现。
- 人们一般认为,使用Java或C#的开发成本比C++低。但是,如果能够充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。这个条件就是:软件规模和复杂度都比较小。如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。造成这种差别的就是C++的软件工程性。
Java与C++:
Java和C++都是面向对象语言,都能实现面向对象思想(封闭、继承、多态)。由于C++为了照顾大量C使用者,而兼容了C,使得自身仅仅成为了带类的C语言,影响了其面向对象的彻底性。Java则是完全面向对象的语言。它摒弃了其它语言的不足之处,从根本上解决了C++固有缺陷。
- 指针:JAVA语言让编程者无法找到指针来直接访问内存,并且增添了自动的内存管理功能,从而有效地防止了c/c++语言中指针操作失误,如野指针所造成的系统崩溃。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。
- 多重继承:c++支持多重继承,这是c++的一个特征,它允许多个父类派生一个子类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。Java不支持多重继承,但允许一个类继承多个接口(extends + implement),实现了c++多重继承的功能,又避免了c++中的多重继承实现方式带来的诸多不便。
- 数据类型及类 :Java是完全面向对象的语言,所有函数和变量部必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。而c++允许将函数和变量定义为全局的。此外,Java中取消了c/c++中的结构和联合,消除了不必要的麻烦。
- 自动内存管理 :Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于c++的new操作符。下面的语句由一个建立了一个类Read的对象,然后调用该对象的work方法:
Read r=new Read(); r.work();
语句Read r=new Read();在堆栈结构上建立了一个Read的实例。Java自动进行无用内存回收操作,不需要程序员进行删除。C++中必须由程序员释放内存资源,增加了程序设计者的负扔。Java中当一个对象不被再用到时,无用内存回收器将给它加上标签以示删除。JAVA里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。
- 操作符重载 :Java不支持操作符重载。操作符重载被认为是C++的突出特征,在Java中虽然类大体上可以实现这样的功能,但操作符重载的方便性仍然丢失了不少。Java语言不支持操作符重载是为了保持Java语言尽可能简单。
- 预处理功能 :Java不支持预处理功能。c/C++在编译过程中都有一个预编译阶段,即众所周知的预处理器。预处理器为开发人员提供了方便,但增加丁编译的复杂性。JAVA虚拟机没有预处理器,但它提供的引入语句(import)与C++预处理器的功能类似。
- 异常:JAVA中的异常机制用于捕获例外事件,增强系统容错能力。
7. Java不支持缺省函数参数,而C++支持。在c中,代码组织在函数中,函数可以访问程序的全局变量。C++增加了类,提供了类算法,该算法是与类相连的函数,C++类方法与Java类方法十分相似,然而,由于C++仍然支持c,所以不能阻止C++开发人员使用函数,结果函数和方法混合使用使得程序比较混乱。 Java没有函数,作为一个比C++更纯的面向对象的语言,Java强迫开发人员把所有例行程序包括在类中,事实上,用方法实现例行程序可激励开发人员更好地组织编码。
8. 字符串 :c/C++不支持字符串变量,在c和C++程序中使用Null终止符代表字符串的结束,在Java中字符串是用类对象(String和StringBuffer)来实现的,这些类对象是Java语言的核心,用类对象实现字符串有以下几个优点:
a) 在整个系统中建立字符串和访问字符串元素的方法是一致的;
b) 字符串类是作为Java语言的一部分定义的,而不是作为外加的延伸部分;
c) Java字符串执行运行时检空,可帮助排除一些运行时发生的错误;
d) 可对字符串用“十”进行连接操作。
9. “goto语句”:“可怕”的goto语句是c和c++的“遗物”,它是该语言技术上的合法部分,引用goto语句引起了程序结构的混乱,不易理解,goto语句用于无条件转移子程序和多结构分支技术。Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使用,使程序简洁易读。
10.类型转换:在c和C++中有时出现数据类型的隐含转换,这就涉及了自动强制类转换问题。例如,在C++中可将一浮点值赋予整型变量,并去掉其尾数。Java不支持C++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。
try {
//可能产生例外的代码
} catch (exceptionType name) {
//处理
}
其中exceptionType表示异常类型。而C++则没有如此方便的安全机制的语言。
- C++相对比较复杂、健壮性弱,运行速度快,Java相对比较简单、便利。
- 如果从事Web和Internet行业,建议学习JAVA,
如果从事桌面系统开发或是服务开发,linux以及单片机的行业,建议学习C++。
Java与C:
- C是底层的,java是包装的,java能做的C都能做。
C做的东西执行效率高但java比C的开发效率高;
- Java和C都是指令式语言(Imperative Language),都是编程语言。不同的是Java是完全面向对象(OO)的语言,而C是完全面向过程的,C的高级版本C++、C#支持面向对象。
- c和java都是可以跨平台的, c基于编译技术, java基于虚拟机, 两个语言跨平台的机制不同
- Java跨平台,既不同的操作系统都可以通过JVM(java虚拟机)来解释Java程序,而C、C++、C#则是与平台相关的,有些指令只在某些操作系统中才能执行。具体原因是,Java是解释型语言,所有代码都会翻译成统一的、与系统无关的bytecode,然后放到JVM上运行;而C是编译式语言,代码要先通过编译器转换成与系统相关的中间代码,然后才能运行。
- Java不支持系统调用,既无法与操作系统进行交互,这是由它跨平台的特点决定的,而C则可以调用系统中的指令,如fork()。这也就是为什么Java中只有线程(Thread)概念而没有进程(Process)概念,而C两者均有。
- Java无法对内存进行控制,而C则可以通过指针对内存进行人为分配。还有一点,Java有Garbage Collection机制,可以自动回收不再使用的空间,而C则要用free()函数释放空间。
参考资料:
- 1. 百度百科
- 2. 百度知道