`
kofsky
  • 浏览: 201622 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

C++与java中的参数传递

阅读更多

  Java传值与传引用。对基本数据类型传递值,对象则传引用。传递对象时,若在被调函数体内改变了对象的值,那么在调用函数内对象的值也会改变。试试下面一段代码。

void testValue(int i)
    
...{
        i
=100;
    }

    
void testInteger(Integer i)
    
...{
        i
=new Integer(200);
    }

    
void testStr1(StringBuffer str)
    
...{
        str.append(
"---add--");
    }

    
void testStr2(StringBuffer str)
    
...{
        str
=new StringBuffer("@new@");
    }

    
public static void main(String[] args)
    
...{
        
new TestDerived().test();
    }

    
void test()
    
...{
        
int i=7;
        
        System.out.println(
"i:"+i);
        testValue(i);
//传值
        System.out.println("testValue(i):"+i);
        
        Integer oi
=new Integer(7);
        testInteger(oi);
//传引用
        System.out.println("testInteger(i):"+oi);
        
        StringBuffer str
=new StringBuffer("raw");
        System.out.println(
"str:"+str);
        testStr1(str);
//传引用
        System.out.println("testStr1(str):"+str);
        
        testStr2(str);
//传引用
        System.out.println("testStr2(str):"+str);
    }

如果按照我的理解,那么结果应该是:
i:7
testValue(i):7
testInteger(i):200
str:raw
testStr1(str):raw---add--
testStr2(str):@new@


可是实际上,运行出来的结果却是:
i:7
testValue(i):7
testInteger(i):7
str:raw
testStr1(str):raw---add--
testStr2(str):raw---add--

    让我很困惑。查阅了一些资料,才发现,引用和指针一样,在编译器传递参数值,都会为这个引用/指针制作一个副本。比如上面的函数void testInteger(Integer i);当调用testInteger(oi)时,编译器为引用oi制作一个副本_oi,这个副本_oi当然也指向对象oi指向的对象。 当在函数体内执行i=new Integer(200);时,创建了一个Integer对象,并将其引用赋值给_oi。而在函数main内的对象oi却并没有改变。因而输出的值仍然为7。而为社么函数testStr1会改变字符串str的值呢?那是因为testStr1的执行语句,str.append("---add--");是针对str指向的对象操作的,因此也改变了函数main内字符串str的值。

    极端一点说,java里面都传的是值,即在函数调用时,都会为参数制作一个副本,然后将参数值复制过去。
只不过,对基本数据类型参数,传递的是该参数的基本数据值,在函数内创建的是相同数据类型的副本;而对对象而言,传递的是引用的值,会创建一个引用的副本,然后使其指向引用参数所指向的对象。当传递参数为对象时(即传引用),在被调函数体内,如果是针对引用所指向的对象操作,那么将会修改调用函数内对象的值;如果针对引用本身操作,那么,将不会修改调用函数内对象的值。就像上面的例子,testStr1是针对引用所指向的对象操作(改变调用者的值),而testStr2则是针对引用本身操作(不改变调用者的值)。


C++中的指针与引用也与这个是非常类似的。


void testValue(int i)
...{
    i
=100;
}

void testPoint1(int* pi)
...{
    pi
=NULL;
}

void testPoint2(int* pi)
...{
    
*pi=200;
}

void testReference(int *pi)
...{
    pi
=NULL;
}

int main(int argc, char* argv[])
...{
    
int* pi=new int(7);
    cout
<<"*pi:"<<*pi<<endl;
    testValue(
*pi);
    cout
<<"testValue(pi):"<<*pi<<endl;

    testPoint1(pi);
    cout
<<"testPoint1(pi):"<<*pi<<endl;//correct

    testPoint2(pi);
    cout
<<"testPoint2(pi):"<<*pi<<endl;

    
int *&rp=pi;
    testReference(rp);
    cout
<<"testReference(pi):"<<*pi<<endl;//correct
    
    
return 0;
}


运行结果为:
*pi:7
testValue(pi):7
testPoint1(pi):7(由于是针对指针本身操作,即使函数体内指针被赋值为null,这里也不会出错)
testPoint2(pi):200
testReference(pi):200 

 

分享到:
评论

相关推荐

    Jni中C++和Java的参数传递

    在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java对象和C++数据类型的映射关系。在JNI中,Java的基本数据类型如`boolean`, `byte`, `char`, `short`, `int`, `float`, `...

    Jni中C++和Java的参数传递.pdf

    例如,我们可以定义一个`DiskInfo`类,包含一个字符串`name`和一个整型`serial`,然后声明一些本地方法来处理参数传递: ```java public class DiskInfo { public String name; public int serial; // 声明本地...

    《C++ for Java Programmers》高清完整英文PDF版

    书中强调了C++与Java之间的差异,并着重介绍了C++的底层C风格细节。书中的章节涵盖C++哲学、最简单的C++、指针和引用变量、基于对象的编程:类、运算符重载、面向对象的编程:继承、模板、异常控制流、输入和输出、...

    C与C++中的函数参数传递机制

    ### C与C++中的函数参数传递机制 #### 引言 在C与C++编程语言中,函数参数的传递方式是程序设计中的一个重要概念。它不仅直接影响到函数内部如何处理这些参数,还决定了函数调用时对原始数据的影响。本文将深入...

    在Qt平台C++和Java代码的交互

    在Qt中,可以使用QProcess或其他I/O组件来启动JVM并传递参数,以执行Java代码。同时,可以使用信号和槽机制来协调C++和Java之间的事件处理。 为了在实际项目中实现这一功能,你可能需要考虑更多的细节,比如错误...

    JNI开发Java和C/C++互相传递List集合

    JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...

    C、C++函数参数传递方式.pdf

    C和C++中的函数参数传递方式主要分为值传递、指针传递和引用传递。这些方式决定了参数在函数调用时的传值行为,以及它们在函数执行后是否能够影响原始数据。下面详细解释这些传递方式的知识点。 1. 值传递(Call by...

    Jni中C和Java的参数传递.doc

    在上面的示例中,我们展示了如何在 JNI 中处理 Java 对象与 C++ 结构体之间的转换。需要注意的是,Java 中的对象在传递给 C++ 时,需要通过 JNI 提供的 API 来获取其字段值。此外,由于 Java 和 C++ 数据类型的差异...

    C++调用Java接口

    最后,在Java代码中,创建`JavaInterface`的实例,并通过反射调用`callFromCpp`方法,传递参数并执行C++代码。 9. **示例项目“CInvokJava”** “CInvokJava”项目很可能是包含上述步骤实现的一个具体示例,包括...

    java及C++中传值传递、引用传递和指针方式的理解.docx

    本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用传递以及C++中的指针传递,并通过具体的代码示例来帮助理解这些概念。 #### 值传递 值传递是最简单的参数传递方式之一,它指...

    java中参数传递方式详解

    Java中参数传递方式详解 Java 中参数传递方式详解是 Java 新手入门面临的一个经典的话题。本文意在终结这个话题,Java 中有说法:Java 里面参数传递都是按值传递,怎么理解这句话? 按值传递和按引用传递是来自 ...

    java及C++中传值传递、引用传递和指针方式的理解

    值传递与Java类似,只是C++允许对基本数据类型进行直接复制。引用传递类似于Java中的引用,但它不像Java那样创建引用副本,而是直接提供原始对象的别名。这意味着对引用参数的任何修改都会影响原始对象,如`ByRef`...

    JNI中C和Java参数传递详细例子

    ### JNI中C和Java参数传递详解 #### 一、引言 Java Native Interface (JNI) 是Java平台标准的一部分,用于让Java代码与其他语言写的代码进行交互。本文将深入探讨在JNI环境中,C/C++和Java之间如何进行参数传递,...

    3.jni_c++调用java中的方法

    在本主题中,我们将深入探讨如何使用C++通过JNI来调用Java中的方法,以及如何实现C++与JavaScript的互调。这在跨平台开发、性能优化或利用现有C/C++库时尤其有用。 首先,我们需要理解JNI的基本结构。JNI接口定义了...

    C++库封装JNI接口-实现java调用c++

    在跨平台的软件开发中,有时我们需要...这个过程需要理解Java和C++之间的数据类型转换,以及如何在两种语言之间传递参数和返回值。熟练掌握JNI可以极大地扩展Java应用的功能,尤其是在需要高性能计算或利用硬件特性时。

    Java的引用和函数参数传递

    ### Java的引用与函数参数传递详解 #### 一、Java中的引用基础 在Java中,对象的引用扮演着类似于其他编程语言(如C/C++)中指针的角色,但是Java的引用比传统的指针更加安全且易于管理。这是因为Java的设计者们...

    C++、Java和C_的语法比较.doc

    根据提供的文档信息,我们可以深入探讨C++、Java与C#三种编程语言之间的语法差异。这里主要聚焦于C++与C#的对比,并适当提及Java的相关特性,以帮助读者更好地理解这些语言之间的区别。 ### 一、继承 **C++**: ...

    C++与Java混合编程.docx

    C++程序通过JNI调用Java方法,传递参数和接收返回值。 在混合编程中,字符串处理是一个关键点,因为Java的字符串默认使用UTF-8编码,而在C++中可能需要进行编码转换以避免乱码问题。JNI提供了一些辅助函数,如`...

    java语言中的参数传递

    Java 有两类参数传递方式:按值传递(by value)和按引用传递(by reference),虽然 Java 没有真正的按引用传递,但其效果类似于 C++ 或 C# 中的引用传递。 1. **按值传递(by value)**: - 适用于基本数据类型...

    java参数传递时到底是值传递还是引用传递[归类].pdf

    Java的参数传递方式实际上是一种特殊的"值传递",通常被称为"按引用传递对象的引用",这与C++等语言中的引用传递有所不同。以下是对这个主题的详细解释。 在Java中,所有的参数传递都是基于值的,但这涉及到一个...

Global site tag (gtag.js) - Google Analytics