.Net,Java与C/C++语言的比较(配合代码实现,继续更新中......)

来源:互联网 发布:java写的计算器 编辑:程序博客网 时间:2024/03/29 14:40
   
1.     下列.Net,Java与C/C++语言的比较(配合代码实现)
 
以下示例:
C/C++是在Dev C++ Version 4.9.92 调试通过;
Java是在MyEclipse 5.5.1调试通过;
.Net是在Microsoft Visual Studio .NET 2003调试通过;

a.全局变量
  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;
publicclassproject2 {
 
         public String s;
         public project2()
         {
                   s= "s is in project2.java";           
         }
}
**************************************
package Wstudy;
import java.util.*;
publicclass project1 {
 
         publicstaticvoid main(String arge[])
         {
                   project2 object = new project2();
                   System.out.println(object.s);
         }
}
b.条件转移指令
  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程序的安全。
 
 
d.内存管理
  在C语言中,程序员使用库函数malloc()和free()来分配和释放内存,C++语言中则是运算符new和delete。再次释放已经释放的内存块或者释放未被分配的内存块,会造成系统的崩溃,而忘记释放不再使用的内存块也会逐渐耗尽系统资源。在java(.net)中,所有的数据结构都是对象,通过运算符new分配内存并得到对象的使用权。无用内存回收机制保证了系统资源的完整,避免了内存管理不周而引起的系统崩溃。Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于c++的new操作符。下面的语句由一个建立了一个类Read的对象,然后调用该对象的work方法:
Read rnew 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数据的平台无关性和可移植性。
 
f.类型转换
  在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)语句与其它类进行通信,以便访问其它类的对象。
 
 
h.结构和联合
  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)可对字符串用“十”进行连接操作。
原创粉丝点击