`
dolaameng328
  • 浏览: 30291 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

C++ 与 JAVA的不同点

 
阅读更多

 

一、 变量的定义和缺省初始化

c++ 中声明变量的时候大多的进行了定义(即分配了内存),特例有:

1) extent int x,仅仅声明了x,没有为x分配内存。

2) 函数的声明(即在调用函数之前进行的声明,此时未定义)。

3) 类的声明。

java中 方法中的变量在声明时没有初始化,有些人以为会被初始化为null,其实不是.不初始化的话,编译器会报错的.直到被赋值或者被调用。

成员变量则在声明时候被初始化,初始化成一个默认值.比如整数为0,对象则被初始化为null。

C++中基本类型的数据,只在全局的时候才进行缺省初始化

二、 static

由于C++中static的含义要比java广的多。static变量本身有种“共享”的属性,并且共享它的“用户”的权限都是可读可写。其中若有一位改变了它的值,其他的“用户”也只能接受这种改变。对于C++来说:

1) 全局静态变量或者局部静态变量可以让它们相应作用域中的“用户”来使用;

2) 类中的静态成员变量和静态成员函数可以用类名访问或者用对象访问(如果权限允许的话),而且其静态成员变量仅能在类外初始化:

variable_type CLASSNAME:: variable_name = value。

对于java而言,因为java严格遵守oop的思想,static仅体现在类的成员变量和方法上。用法同2),但是其初始化可以在类内部完成。

三、 作用域

C++允许在一个块(block)的子块中定义与此块中相同的变量名,并且子块变量中完全覆盖父块的变量。JAVA是不允许的 。

四、 运算符重载

java 并没有像C++那样提供运算符重载功能,因此java里用“==”判断字符串相等不再实用(此时的“==”只是表示位置的相同, 虽然位置相同的字符串一定相同,但是值相同的字符串未必在同一位置),此时需要用方法equals(String str)。

五、 功能强大的 “for each”循环

java中有这样的for循环语句: 
for(element:collection)

其中collection 是实现了interable接口的集合,C++中则没有此语句。

六、 对象赋值引用

此处是最容易忽视的,也是最严重的区别,Test.java文件中有如下代码: 
    public class Test 
{    
    public Test(int value) 
    { 
        this.value = value; 
    } 
    public void print() 
    { 
        System.out.println(value); 
    } 
    public void setValue(int value) 
    { 
        this.value = value; 
    } 
    private int value; 
    public static void main(String args[]) 
    { 
        Test test1 = new Test(1); 
        Test test2 = test1; 
        test2.setValue(2); 
        test1.print(); 
    } 

此时,输出为2。可见java中的对象间"="操作相等于C++中"&"(引用)一样,C++对象的"="操作实际上是拷贝操作,相当于JAVA中的clone(Object other)方法。而对于数组,JAVA中也将之作为对象看待,比如如下语句: 
        int[] intArr = {1,2,3}; 
        int[] intArr2 = intArr; 
        intArr2[0] = 3; 
        System.out.println(intArr[0]); 
输出值为3。

七、 默认的动态绑定

JAVA中子类会自动覆盖父类的同名方法,而不用像C++,将父类方法声明为vitual型。如果不想让子类覆盖,应该实用final修饰。也就是说:C++默认是不覆盖的,要覆盖需要主动说明;而JAVA默认是覆盖的,要取消覆盖需要主动说明。

八、 多重继承与接口

多重继承(Multiple inherit)容易带来歧义和重复继承,远比单一继承复杂。JAVA声称自己并不支持多重继承,但是它巧妙地利用了接口(interface)的概念, 实现了多重继承的功能,实际上C++中在多重继承时也经常使用无成员变量的虚拟基类(abstract class)这实际上相当于JAVA中的接口。形象地说,JAVA中的接口更像是一种“规则”。比如Comparable 接口,所有要实现比较对象操作的类都得遵守Comparable的规则,即要实现CompareTo方法。而多重继承中的父类不仅仅是实现定义规则的功 能,还提供一些数据和方法。

九、 C++中的嵌套类和java中的内部类

C++中嵌套类相当于“局部类”,相当于局部变量,可以解决名字冲突和访问控制。java中的内部类则远比C++复杂,由于java并没有变量覆盖的概念(参见第三条),所以内部类的设计初衷就与C++的嵌套类有很大区别。其功能如下:

1) 内部类可以方便地访问其外部类的任何成员(如同外部类的方法)。

2) 内部类可以用private来修饰,此时仅有外部类可以创建其实例。

(待续)

十、JAVA函数参数传值调用,参数如果是基本类型,参数本身不可变;如果是对象引用,引用不可以指向新的对象。
 这里有三个原则:
 1、对于基本类型的参数,函数不能改变其值
 2、对于对象引用参数,函数不能其引用目标
 3、对于对象引用参数,函数可以改变其引用对象的状态
因此,在C++里可行的swap(T& t1, T& t2)(或者swap(T *pt1,T *pt2))函数,在C++里是做不到的。要想交换两个变量的值,除非将他们放入一个类,然后用上面的第三种方法来交换。
 如下:
class Test
{
public int i0 = 0;
public int i1 = 1;
}
swap(Test t)
{
 int tem = t.i0;
 t.i0 = t.i1;
 t.i1 = tem;
}

 

分享到:
评论

相关推荐

    c++与Java的异同

    比较详细的说明了C++和java的相同点和不同点,对于还在犹豫学习C++还是java的同学是很好的参考资料哦。

    比较学习C++与java

    本人学习过程中总结的,涵盖C++大部分知识点以及其中JAVA与之异同之处,通过不同颜色进行标注,非常显眼,给你一目了然的感觉,谢谢!

    C、C 、Java及软件测试的笔试、面试题集合Version2

    在原来的基础上我加了点我做过的题,题不可能面面俱到,收录的只是以前常见常做的,不同的公司有不同的题,而且时刻在变更,不可能一成不变吧。 解压后有四个部分: C++笔试题.rar Java笔试题.rar 软件测试.rar ...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    corejava基础重要知识点总结

    java的优势? 1:跨平台(平台:指的是操作系统) 常见的操作系统:Windows Unix Linux Solaris(Sun) 跨平台:用java开发出来的应用程序不受底层操作系统的限制 底层的功臣:JVM = java虚拟机 = 1 + 2 + 3 = ...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    java基础入门教程

    建 立一 个 "Java 开 发 中 心 ",在 新 竹 建 立 一 个 "Java语 言实 验 室 ", 以 掀起 台 湾 开 发 与 应 用 Java 语 言 的 热 潮 。 香 港 则 在 今 年 4月 就 举 行 了 全 岛 的 Java杯 比 赛 ,在 计 算 机界掀...

    跟我一起学C++

    C语言注重前两者,C++注重前三者,JAVA、.net这些注重后两者。 2 从C到C++(一) 2.1 bool类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个...

    DBSCAN算法 C++ 实现

    Dbscan算法是基于密度的聚类划分算法,这点和K-MEANS算法不同,也是这个算法的特点。本程序采用C++编写,参考了网上的一些资料以及WEKA中cluster java包的实现机制。

    java开源包11

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包6

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包9

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包101

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包4

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包5

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包8

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包10

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包3

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java开源包1

    J2C 将 Java 代码转成 C++ 代码,这是源码级别的转换,输出的 C++ 代码是有效的代码。 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构的分布式通讯组件。它以 jar 的形式发布,部署容易,使用...

    java之路,主要是java中的学习过程与基础项目.rar

    看书学习,如《Redis设计与实现》、《 Java 并发编程的艺术》,便于了解技术脉络和深入学习知识点。 看博客和源码精进学习。博客的好处是有些知识点会以很通俗的方式讲解出来,我们很好理解。 第一阶段: Java ...

Global site tag (gtag.js) - Google Analytics