现在的位置: 首页 > 综合 > 正文

C/C++与Java的之间的差异

2013年08月06日 ⁄ 综合 ⁄ 共 3205字 ⁄ 字号 评论关闭

C/C++与Java的之间的差异
Difference between Java and C/C++

原文参见:http://docs.rinet.ru/Jintra/appe.htm
i.a_7 译

 

预处理器(Preprocessor):
所有的C/C++编译器在编译过程中有一个阶段的处理称之为预处理器.C++的预处理器主要是进行搜索和置换被#define,#typedef等指示符所声明的标识符.尽管大多数C++的拥护者不提倡使用这种由C语言继承而来的特征,这种用法还是在C++程序员中被广泛的使用.C++中大部分预处理器的定义是存储在用来补充实际代码文件的头文件中.

使用预处理器的方法带来的问题就是,程序员很容易在不经意间增加了程序的复杂度.一个例子就是在一个项目中,众多程序员使用#define,#typedef等指示符来标示他们自己所创建的一系列名词,其直接导致的结果就是其他的程序员为了理解程序,不得不查看所有的头文件来找到相应的信息,这就使得代码的维护和重用变的近乎不可能.另一个使用预处理器方法的问题就是当进行型别检查或有效性检查时缺乏足够的稳定性.

Java中没有预处理器.它提供了和C++预处理器有着相似的函数功能,而且加深了控制.用常量数据成员来替代#define指示符,用类定义来替代#typedef所使用的场合.这样就使得Java的源代码比C++更加连贯和可读.另外,Java程序并不使用头文件,Java的编译器直接由同时包含类的定义和方法实现的源代码中创建类定义.

 

指针
大多数开发人员都认同在使用C/C++编程时,指针的误用是造成程序错误的主要原因.简而言之,当你有指针时,你就有可以对内存进行破坏的能力.C++程序员通常使用复杂的指针运算来创建和维护动态数据结构,结果就是C++程序员花费大量时间在解决由那复杂的指针运算所造成的千奇百怪的问题.

Java语言不支持指针.Java通过提供大量的引用来实现与指针相似的操作.Java中,所有的数组和对象都是通过引用来进行传递的.这种方法避免了由于指针的错误管理所造成的常见错误.这使得编程在很多方面变得简单化,因为除了那些经验老到的程序员,一般人很容易混淆正确的指针用法.

你可能会想,由于没有指针,在Java中就无法实现例如动态数组等很多数据结构.事实上,任何指针能够完成的任务都可以用对象和数组对象更加可靠的实现.你还能受益于由Java的runtime system提供的安全性保障,如对所有数组的索引进行边界检查.

 

结构和联合(Structures and Unions)
在C++中有三种复杂的数据类型:类,结构和联合.Java仅仅实现了这三种类型中的一种:类.Java会强制用户使用类来替代使用结构或者联合来实现所需要的功能.尽管听上去程序员需要为此而付出更多的工作,实际上,由于类可以简单的模拟出结构和联合,这使得代码更加协调.Java的设计人员诚挚的希望保持语言的简单性,所以就消除了语言特征中的重复的部分.

函数(Functions):
在C语言中,代码是由各个子程序所构建的函数所组织而成的.C++添加了类的概念和类的方法,也就是与类相关的函数.C++中类的方法跟Java中类的方法是很相似的.然而,由于C++对C的支持,也就没办法让C++的程序员不在类中使用函数.函数跟方法的混合使用就直接导致了对程序理解的困惑.

Java中没有函数的概念.作为一种比C++更加纯粹的面向对象语言,Java强制程序员将所有的程序都集成到方法中.强制使用方法代替函数并没有其他的限制.结果就是,以方法的形式来实现程序鼓励了程序员更好的组织代码结构.记住这一点:使用函数并没有任何程序途径上的错误.它只是与Java范例中面向对象的精髓不相符.

 

多重继承(Multiple Inheritance)
多重继承是C++的一个特征,使得你可以从不同的父类派生子类.尽管多重继承有时是一种强有力的继承方式,但由于其复杂性而导致的错误使用,常常造成很多的问题.从编译器的角度考虑,多重继承也是很复杂而不易实现的.

Java选择另外一种方式而没有直接支持多重继承.你可以通过Java的接口(interfaces)来实现和多重继承相类似的功能.Java的接口提供对象方法描述而不包含实现部分.

字符串(Strings)
C和C++并没有把文本字符串加入到其内建类型中去.C和C++中使用的一种标准技术就是以空为结束符在数组中标示字符串.

在Java中,字符串是作为第一个类对象来实现的(String和StringBuffer),这就意味着Java为字符串提供了内核级的支持.Java用对象来实现字符串有如下优点:
.跨平台和语言的创建字符串和对其中的元素访问进行管理
.因为Java中字符串是定义为语言的一部分而不是扩展的一部分,这就使得Java字符串函数具有可预见性(predicatably).
.由于Java执行的是扩展运行检查(extensive runtime checking),这就可以帮助消除一些棘手的运行时错误(runtime errors).

 

goto语句(The goto Statement)
即便是在C和C++中,令人生畏的goto语句也是饱受争议,但从技术上讲,goto语句是语言合法的一部分.对goto语句由来已久的批判来自于其会造成代码结构的混乱和不可读,有时甚至会导致一种所谓"意大利面"般不可预测性.goto语句一般适用在那些不需要进行判断就进行跳转的地方,更加结构化的分支技术.

出于这样或者那样的原因,Java并不支持goto语句.Java语言指定goto作为一个关键字,但是并不支持其使用.我想Java的设计者甚至是想消除把"goto"作为一个标识符的可能性.不包含goto语句的Java语言使得语言简单化而且避免了写出结构混乱的代码.

 

操作符重载(Operator Overloading)
操作符重载,作为C++的一个显著的特征,而Java并不支持.尽管Java通过类的一些实现来提供相似的功能,仍然缺少了一些由操作符重载带来的便利.然而,从保护Java的角度来看,操作符重载有时可能变得技巧性太强(tricky).毫无疑问,Java的开发者让语言不支持操作符重载的决定使得Java尽可能的简单化.

 

自动缩减(Automatic Coercions)
自动缩减与在C/C++中出现的数据类型的隐式转换相关.例如:在C++中你可以把一个float的值赋值给一个int变量,这样就会导致一些信息的丢失.Java并不支持C++风格的自动缩减.在Java中,如果某种缩减会导致数据的丢失,那么你就必须显式的指定将要转换的数据类型.

可变参数(Variable Arguments)
C/C++允许你声明一个函数使用可变参数,例如printf.尽管这是一个便捷的特征,但同时也使得编译器无法对参数类型完整的进行检查,这也就意味着运行时会出现一些你所不知道的问题.Java不支持可变参数.

 

命令行参数(Command-Line Arguments)
系统传递给Java程序的命令行参数跟系统传递给C++程序的命令行参数是一种截然不同的.受限,传递给两种语言的参数的数目不同.在C/C++中,系统传递给程序两个参数:argc和argv,前者指定了存储在argv中的参数个数,后者是一个指向存储着实参数组地址的字符指针.在Java中,系统传递给程序一个单独的值:args.args是一个包含了命令行参数的字符串数组.

在C/C++中,传递给程序的命令行参数包含调用函数的名字.这个很少使用到的名字是作为第一个实参保存的.在Java中,你已经知道了与类名称相同的程序的名字,所以就不需要把程序的名字作为命令行参数进行传递.因此,Java运行时系统(runtime system)仅仅传递调用程序名称后的参数.

 

抱歉!评论已关闭.