1.
下列.Net,Java与C/C++语言的比较(配合代码实现)
以下示例:
C/C++是在Dev C++ Version 4.9.92 调试通过;
Java是在MyEclipse 5.5.1调试通过;
.Net是在Microsoft Visual Studio .NET 2003调试通过;
C/C++是在Dev C++ Version 4.9.92 调试通过;
Java是在MyEclipse 5.5.1调试通过;
.Net是在Microsoft Visual Studio .NET 2003调试通过;
a
.全局变量
java(.net)程序不能定义程序的全局变量,而类中的公共、静态变量就相当于这个类的全局变量。这样就使全局变量封装在类中,保证了安全性,而在C/C++语言中,由于不加封装的全局变量往往会由于使用不当而造成系统的崩溃。
java(.net)程序不能定义程序的全局变量,而类中的公共、静态变量就相当于这个类的全局变量。这样就使全局变量封装在类中,保证了安全性,而在C/C++语言中,由于不加封装的全局变量往往会由于使用不当而造成系统的崩溃。
示例(c/c++):
#include <cstdlib>
#include <iostream>
int t_int = 2;(
全局变量
)
int main(int argc, char *argv[])
{
printf("t_int value: %d/n",t_int);
system("PAUSE");
return EXIT_SUCCESS;
}
示例
(java):
package
Wstudy;
public
class
project2 {
public
String
s
;
public
project2()
{
s
=
"s is in project2.java"
;
}
}
**************************************
package
Wstudy;
import
java.util.*;
public
class
project1 {
public
static
void
main(String arge[])
{
project2 object =
new
project2();
System.
out
.println(object.
s
);
}
}
b
.条件转移指令
C/C++语言中用goto语句实现无条件跳转,而java语言没有goto语言,通过例外处理语句try、catch、finally来取代之,提高了程序的可读性,也增强了程序的鲁棒性。
C/C++语言中用goto语句实现无条件跳转,而java语言没有goto语言,通过例外处理语句try、catch、finally来取代之,提高了程序的可读性,也增强了程序的鲁棒性。
示例(c/c++):
#include <string>
#include <iostream>
class B{
public:
B(){
cout << "BBBBBBBBBBBB" <<endl;
};
~B(){
cout << "SHB" << endl;
};
protected:
private:
};
int func(...){
cout << "EN";
return 0;
};
int main (int argv,char* argc[]){
while(1)
{
B b;
goto HEIHEI;
//
屏蔽掉
goto
和开启
goto
看看
B
的析构函数是怎么跑的,能正确析构吗?
goto
都干了什么。
}
HEIHEI: int ABC = 0;
return 0;
}
c
.指针
指针是C/C++语言中最灵活,但也是最容易出错的数据类型。用指针进行内存操作往往造成不可预知的错误,而且,通过指针对内存地址进行显示类型转换后,可以类的私有成员,破坏了安全性。在java(.net)中,程序员不能进行任何指针操作,同时java(.net)中的数组是通过类来实现的,很好的解决了数组越界这一C/C++语言中不做检查的缺点。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。
指针是C/C++语言中最灵活,但也是最容易出错的数据类型。用指针进行内存操作往往造成不可预知的错误,而且,通过指针对内存地址进行显示类型转换后,可以类的私有成员,破坏了安全性。在java(.net)中,程序员不能进行任何指针操作,同时java(.net)中的数组是通过类来实现的,很好的解决了数组越界这一C/C++语言中不做检查的缺点。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。
d
.内存管理
在C语言中,程序员使用库函数malloc()和free()来分配和释放内存,C++语言中则是运算符new和delete。再次释放已经释放的内存块或者释放未被分配的内存块,会造成系统的崩溃,而忘记释放不再使用的内存块也会逐渐耗尽系统资源。在java(.net)中,所有的数据结构都是对象,通过运算符new分配内存并得到对象的使用权。无用内存回收机制保证了系统资源的完整,避免了内存管理不周而引起的系统崩溃。Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于c++的new操作符。下面的语句由一个建立了一个类Read的对象,然后调用该对象的work方法:
在C语言中,程序员使用库函数malloc()和free()来分配和释放内存,C++语言中则是运算符new和delete。再次释放已经释放的内存块或者释放未被分配的内存块,会造成系统的崩溃,而忘记释放不再使用的内存块也会逐渐耗尽系统资源。在java(.net)中,所有的数据结构都是对象,通过运算符new分配内存并得到对象的使用权。无用内存回收机制保证了系统资源的完整,避免了内存管理不周而引起的系统崩溃。Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于c++的new操作符。下面的语句由一个建立了一个类Read的对象,然后调用该对象的work方法:
Read r
=new Read();
r.work()
;
语句Read r=new Read();在堆栈结构上建立了一个Read的实例。Java自动进行无用内存回收操作,不需要程序员进行删除。而c++中必须由程序释放内存资源,增加了程序设计者的负担。Java中当一个对象不被再用到时,无用内存回收器将给它加上标签以示删除。JAVA里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。
示例(c/c++):
#include <cstdlib>
#include <iostream>
char *string;
char *str1 = "abcdefghi";
char *str2 = "ABCDEFGHI";
int main(int argc, char *argv[])
{
string = new char[10];
strcpy(string, str1);
printf("%s/n", string);
delete []string;
string = new char[10];
strcpy(string, str2);
printf("%s/n", string);
system("PAUSE");
return EXIT_SUCCESS;
}
e
.数据类型的一致性
在C/C++语言中,不同的平台上,编译器对简单的数据类型如int、float等分别分配不同的字节数。例如:int在IBM PC上为16位,在VAX-11上就为32位,导致了代码数据的不可移植。在java中,对数据类型的位数分配总是固定的,而不管是在任何的计算机平台上。因此就保证了java数据的平台无关性和可移植性。
在C/C++语言中,不同的平台上,编译器对简单的数据类型如int、float等分别分配不同的字节数。例如:int在IBM PC上为16位,在VAX-11上就为32位,导致了代码数据的不可移植。在java中,对数据类型的位数分配总是固定的,而不管是在任何的计算机平台上。因此就保证了java数据的平台无关性和可移植性。
f
.类型转换
在C/C++语言中,可以通过指针进行任意的类型转换,不安全因素大大增加。而在java(.net)语言中系统要对对象的处理进行严格的相容性检查,防止不安全的转换。在c和c++中有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在c++中可将一浮点值赋予整型变量,并去掉其尾数。Java不支持c++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。
在C/C++语言中,可以通过指针进行任意的类型转换,不安全因素大大增加。而在java(.net)语言中系统要对对象的处理进行严格的相容性检查,防止不安全的转换。在c和c++中有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在c++中可将一浮点值赋予整型变量,并去掉其尾数。Java不支持c++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。
示例(c/c++):
#include <cstdlib>
#include <iostream>
char *string;
char *str1 = "abcdefghi";
char *str2 = "ABCDEFGHI";
int main(int argc, char *argv[])
{
int i=0;
if(i)
{
printf("%d/n", i);
}
}
但是如果在java(.net)中使用,将提示错误:不能将int型 转换成 Boolean 型
g
.头文件
在C/C++语言中使用头文件声明类的原型和全局变量及库函数等,在大的系统中,维护这些头文件是非常困难的。java不支持头文件,类成员的类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止非法的访问。同时,java(.net)中用import(using)语句与其它类进行通信,以便访问其它类的对象。
在C/C++语言中使用头文件声明类的原型和全局变量及库函数等,在大的系统中,维护这些头文件是非常困难的。java不支持头文件,类成员的类型和访问权限都封装在一个类中,运行时系统对访问进行控制,防止非法的访问。同时,java(.net)中用import(using)语句与其它类进行通信,以便访问其它类的对象。
h
.结构和联合
C/C++语言中用结构和联合来表示一定的数据结构,但是由于其成员均为公有的,安全性上存在问题。java不支持结构和联合,通过类把数据结构及对该数据的操作都封装在类里面。
C/C++语言中用结构和联合来表示一定的数据结构,但是由于其成员均为公有的,安全性上存在问题。java不支持结构和联合,通过类把数据结构及对该数据的操作都封装在类里面。
i
.预处理
C/C++语言中有宏定义,而用宏定义实现的代码往往影响程序的可读性,而java不支持宏定义。
j
.
多重继承
c++
支持多重继承,这是c++的一个特征,它允许多父类派生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。Java不支持多重继承,但允许一个类继承多个接口(extends+implement),实现了c++多重继承的功能,又避免了c++中的多重继承实现方式带来的诸多不便
k.
字符串
c
和c++不支持字符串变量,在c和c++程序中使用Null终止符代表字符串的结束,在Java中字符串是用类对象(strinR和stringBuffer)来实现的,这些类对象是Java语言的核心,用类对象实现字符串有以下几个优点:
(1)
在整个系统中建立字符串和访问字符串元素的方法是一致的;
(2)J3
阳字符串类是作为Java语言的一部分定义的,而不是作为外加的延伸部分;
(3)Java
字符串执行运行时检空,可帮助排除一些运行时发生的错误;
(4)
可对字符串用“十”进行连接操作。