`

Java与C++函数参数传递比较

阅读更多

学好C++,为祖国四化做贡献。

简言之:Java都是值传递(pass-by-value),而C++中包括值传递(pass-by-value)和引用传递(pass-by-reference)。

先说Java,先做几点说明:

Java中,无非就是两种类型,即基本类型和从Object继承下来的对象类型,而对象类型又包括String这种一旦初始化就不可改变内容的类型和BufferString这种可以初始化后可

以改变内容的类型。

然后看一下代码示例:

 

java 代码
  1. package test;   
  2.   
  3. public class Test {   
  4.  public static void main(String args[]) {   
  5.   Integer interger1, interger2;   
  6.   int i, j;   
  7.   interger1 = new Integer(10);   
  8.   interger2 = new Integer(50);   
  9.   i = 5;   
  10.   j = 9;   
  11.   System.out.println("Before Swap, Interger1 is " + interger1);   
  12.   System.out.println("Before Swap, Interger2 is " + interger2);   
  13.   swap(interger1, interger2);   
  14.   System.out.println("After Swap Interger1 is " + interger1);   
  15.   System.out.println("After Swap Interger2 is " + interger2);   
  16.   System.out.println("Before Swap i is " + i);   
  17.   System.out.println("Before Swap j is " + j);   
  18.   swap(i, j);   
  19.   System.out.println("After Swap i is " + i);   
  20.   System.out.println("After Swap j is " + j);   
  21.   
  22.   StringBuffer sb = new StringBuffer("I am StringBuffer");   
  23.   System.out.println("Before change, sb is <" + sb + ">");   
  24.   change(sb);   
  25.   System.out.println("After change sb is <" + sb + ">");   
  26.  }   
  27.   
  28.  public static void swap(Integer ia, Integer ib) {   
  29.   Integer temp = ia;   
  30.   ia = ib;   
  31.   ib = temp;   
  32.  }   
  33.   
  34.  public static void swap(int li, int lj) {   
  35.   int temp = li;   
  36.   li = lj;   
  37.   lj = temp;   
  38.  }   
  39.   
  40.  public static void change(StringBuffer ia) {   
  41.   ia.append(", but my content can be changed");   
  42.   //ia = new StringBuffer(",but my content can be changed");   
  43.  }   
  44. }   
  45.   

输出:

Before Swap, Interger1 is 10
Before Swap, Interger2 is 50
After Swap Interger1 is 10
After Swap Interger2 is 50
Before Swap i is 5
Before Swap j is 9
After Swap i is 5
After Swap j is 9
Before change, sb is <I am StringBuffer>
After change sb is <I am StringBuffer, but my content can be changed>

这很好解释,对于基本类型诸如int,传递进去的是存放int值的“内存单元”的一个copy,所以函数swap里面的int和外面的int根本就不是一个东西,当然不能反射出去影响外面

的int。而对于对象类型,我们同样可以这样认为,传递进去的是存放对象类型的指针的“内存单元”一个copy(虽然Java里面没有指针的概念,但这并不妨碍我们理解)。这样,

在swap函数里面,对其指针本身的值做任何操作当然不会影响外面的Integer,因为interger1和interger2的“内存单元”里面的值是不变的,其指向的对象类型也是没有变的。

然后这里需要说明一个问题,就是StringBuffer这种类型的对象了。因为其内容是可以改变的,所以change函数里面的“指针”通过类似“*”的操作,改变了StringBuffer对象的

本身,就显而易见了。(StringBuffer对象本身只有一个副本)

然后说C++了,里面的基本类型的诸如int的值传递大家都了然于胸,就不在这里废话了。然后另一种值传递可以称为指针引用传递(pass-by-value argument of pointer)(这个类

似上文说的Java中的对象类型的值传递),可以通过*操作,改变指针指向的值。示例程序如下,一看便知:

cpp 代码
  1. #include<iostream.h>   
  2.   
  3. int main(){   
  4.  void test(int*, const char*);   
  5.  int i = 1;   
  6.  int* iptr = &i;   
  7.  cout<<"Before pass-by-value:"<<"\n\n";   
  8.  cout<<"i = "<<i<<", It's value of i"<<endl;   
  9.  cout<<"&i = "<<&i<<", It's address of i and value of iptr"<<endl;   
  10.  cout<<"*iptr = "<<*iptr<<", It's value of i"<<endl;   
  11.  cout<<"iptr = "<<iptr<<", It's value of iptr and address of i"<<endl;   
  12.  cout<<"&iptr = "<<&iptr<<", It's address of iptr-self"<<"\n\n";   
  13.     
  14.  test(iptr, "pass-by-iptr");   
  15.   
  16.  test(&i, "pass-by-&i");   
  17.   
  18.  return 0;   
  19. }   
  20.   
  21. void test(int* iiptr, const char* string){   
  22.  cout<<"When pass-by-value and :"<<"\n\n";   
  23.  cout<<"*iiptr = "<<*iiptr<<", It's value of i"<<endl;   
  24.  cout<<"iiptr = "<<iiptr<<", It's value of iiptr and address of i"<<endl;   
  25.  cout<<"&iiptr = "<<&iiptr<<", It's address of iiptr-self, different with iptr!"<<"\n\n";   
  26. }   
  27.   

输出:

Before pass-by-value:

i = 1, It's value of i
&i = 0x0012FF7C, It's address of i and value of iptr
*iptr = 1, It's value of i
iptr = 0x0012FF7C, It's value of iptr and address of i
&iptr = 0x0012FF78, It's address of iptr-self

When pass-by-value and :

*iiptr = 1, It's value of i
iiptr = 0x0012FF7C, It's value of iiptr and address of i
&iiptr = 0x0012FF24, It's address of iiptr-self, different with iptr!

When pass-by-value and :

*iiptr = 1, It's value of i
iiptr = 0x0012FF7C, It's value of iiptr and address of i
&iiptr = 0x0012FF24, It's address of iiptr-self, different with iptr!

在C++里面的第二种就是引用传递了(pass-by-reference)。见如下示例:

cpp 代码
  1. #include<iostream.h>   
  2. int main(){   
  3.  void test(int&, const char*);   
  4.  int i = 1;   
  5.  int &iref = i;   
  6.  cout<<"Before pass-by-reference:"<<"\n\n";   
  7.  cout<<"i = "<<i<<", It's value of i"<<endl;   
  8.  cout<<"&i = "<<&i<<", It's address of i and value of iptr"<<endl;   
  9.  cout<<"iref = "<<iref<<", It's value of iref and value of i"<<endl;   
  10.  cout<<"&iref = "<<&iref<<", It's address of iref-self, the same as i!"<<"\n\n";   
  11.     
  12.  test(iref, "pass-by-iref");   
  13.   
  14.  test(i, "pass-by-i");   
  15.   
  16.  return 0;   
  17. }   
  18.   
  19. void test(int &iiref, const char* string){   
  20.  cout<<"When pass-by-reference and "<<string<<"\n\n";   
  21.  cout<<"iiref = "<<iiref<<", It's value of iiref and value of i"<<endl;   
  22.  cout<<"&iiref = "<<&iiref<<", It's address of iiref-self, the same as i!"<<"\n\n";   
  23. }   
  24.   

输出:

Before pass-by-reference:

i = 1, It's value of i
&i = 0x0012FF7C, It's address of i and value of iptr
iref = 1, It's value of iref and value of i
&iref = 0x0012FF7C, It's address of iref-self, the same as i!

When pass-by-reference and pass-by-iref

iiref = 1, It's value of iiref and value of i
&iiref = 0x0012FF7C, It's address of iiref-self, the same as i!

When pass-by-reference and pass-by-i

iiref = 1, It's value of iiref and value of i
&iiref = 0x0012FF7C, It's address of iiref-self, the same as i!

这里的引用(reference)说的明白一些,就是被传递参数的一个别名,或者更直接的理解就是被传递参数自己了,只是名字不同而已。那么既然自己都被pass过去了,那当然可以在function里面为所欲为了。赫赫。

renki_z对本文亦有贡献

分享到:
评论

相关推荐

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

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

    ocos2d-x 通过JNI实现c/c++和Android的java层函数互调

    cocos2d-x 通过JNI实现c/c++和Android的java层函数互调, 本文主要实现两个功能: (1)通过Android... 首先来简单学习一下JNI的相关知识,我这篇文章中简单实现了怎么在Android Java层调用c++函数。要想使用JNI,必须得…

    JNI技术手册 c/c++调用java

    2) 如何将java传入的String参数转换为c的char*,然后使用? 57 3) 将c中获取的一个char*的buffer传递给java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是...

    NDKC调用Java函数传参或获取变量

    NDK开发时,C/C++调用Java的函数的一些案例; 传递int类型参数: https://blog.csdn.net/niuba123456/article/details/80978500 传递String类型参数: https://blog.csdn.net/niuba123456/article/details/80978916 ...

    使用Java Native Interface调用本地C++代码.txt

    在这个例子中,我们使用Java Native Interface(JNI)来调用本地的C++代码。首先,我们需要在Java类中声明一个native方法,并使用`native`...这些参数可以让我们方便地在Java和C++之间传递数据和调用其他本地方法。

    定义一个圆类circle,它有一个变量radius(半径)。从键盘输入数据,通过构造函数的参数传递给radius,编程计算并输出圆的的周长和面积。但是,必须确保输入的数据不为复数。

    定义一个圆类circle,它有一个变量radius(半径)。从键盘输入数据,通过构造函数的参数传递给radius,编程计算并输出圆的的周长和面积。但是,必须确保输入的数据不为复数。

    javascript函数中参数传递问题示例探讨

    相信每一位刚接触javascript的同学在函数...这是多么爽的一件事情,学过c++/c#或者java的同学可能就会想到函数重载。但是,我要告诉你的是,javascript中不存在函数重载,如果你定义了两个同名函数,那么先定义的函数将

    Java闭包 Java闭包

    在2013年发布的 JavaSE8 中包含一个叫做 ...闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试着放一些样例程序来解释一些概念和语法。

    Java函数与数组实验源代码

    数组存储结构。一维数组、多维数组以及交错数组的定义与使用。 数组如何实例化?Java中的数组与以前的C++中定义的...4、理解方法定义的优势,加深对方法的参数传递与返回类型的理解。 5、了解递归的概念及实现特点。

    C++编程思想 (作者学习C++亲身体会及多年教学经验)

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    C++编程思想1-5 清晰PDF

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    C/C++和Java达到swap不同功能

    首先我们来看看c/c++实施swap性能  void swap ( int & a, int & b)  {  int Temp;  temp = a;  a = b;  b = temp;...  那么在java中是否还能这样呢。非常显然java中没有地址引用...  在Java世界中函数

    java 编程入门思考

    A.6.4 比较CORBA与RMI A.7 总结 附录B 对比C++和Java 附录C Java编程规则 附录D 性能 D.1 基本方法 D.2 寻找瓶颈 D.2.1 安插自己的测试代码 D.2.2 JDK性能评测[2] D.2.3 特殊工具 D.2.4 性能评测的技巧 D.3 提速...

    Java初学者入门教学

    A.6.4 比较CORBA与RMI A.7 总结 附录B 对比C++和Java 附录C Java编程规则 附录D 性能 D.1 基本方法 D.2 寻找瓶颈 D.2.1 安插自己的测试代码 D.2.2 JDK性能评测[2] D.2.3 特殊工具 D.2.4 性能评测的技巧 D.3 提速...

    JNI完全技术手册 带完整书签

    Chap7:Jni中C++和Java的参数传递... 33 Chap8:如何将java传递过来的jbyteArray转换成C/C++中的BYTE数组... 47 Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载...

    C++编程思想(中文版)

    全书共分十八章,内容涉及对象的演化、数据抽象、隐藏实现、初始化与清除、函数重载与缺省参数、输入输出流介绍、常量、内联函数、命名控制、引用和拷贝构造函数、运算符重载、动态对象创建、继承和组合、多态和虚...

    java联想(中文)

    A.6.4 比较CORBA与RMI A.7 总结 附录B 对比C++和Java 附录C Java编程规则 附录D 性能 D.1 基本方法 D.2 寻找瓶颈 D.2.1 安插自己的测试代码 D.2.2 JDK性能评测[2] D.2.3 特殊工具 D.2.4 性能评测的技巧 D.3 提速...

    即时消息传递系统编程源代码

    即时消息传递的常用函数的介绍和使用(转)

    C++大学教程,一本适合初学者的入门教材(part2)

    第1章 计算机与C++编程简介 1.1 简介 1.2 什么是计算机 1.3 计算机组成 1.4 操作系统的变革 I.5 个人计算、分布式计算与客户/a匠务器计算 l. 6 机器语言、汇编语言和高级语言 1.7 C语言与C++的历史 1.8 C++...

    C++大学教程,一本适合初学者的入门教材(part1)

    第1章 计算机与C++编程简介 1.1 简介 1.2 什么是计算机 1.3 计算机组成 1.4 操作系统的变革 I.5 个人计算、分布式计算与客户/a匠务器计算 l. 6 机器语言、汇编语言和高级语言 1.7 C语言与C++的历史 1.8 C++...

Global site tag (gtag.js) - Google Analytics