Java与C++函数参数传递比较——C++学习笔记一

原创 2006年05月20日 23:34:00

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

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

先说Java,先做几点说明:

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

以改变内容的类型。

然后看一下代码示例:

 package test;

public class Test {
 public static void main(String args[]) {
  Integer interger1, interger2;
  int i, j;
  interger1 = new Integer(10);
  interger2 = new Integer(50);
  i = 5;
  j = 9;
  System.out.println("Before Swap, Interger1 is " + interger1);
  System.out.println("Before Swap, Interger2 is " + interger2);
  swap(interger1, interger2);
  System.out.println("After Swap Interger1 is " + interger1);
  System.out.println("After Swap Interger2 is " + interger2);
  System.out.println("Before Swap i is " + i);
  System.out.println("Before Swap j is " + j);
  swap(i, j);
  System.out.println("After Swap i is " + i);
  System.out.println("After Swap j is " + j);

  StringBuffer sb = new StringBuffer("I am StringBuffer");
  System.out.println("Before change, sb is <" + sb + ">");
  change(sb);
  System.out.println("After change sb is <" + sb + ">");
 }

 public static void swap(Integer ia, Integer ib) {
  Integer temp = ia;
  ia = ib;
  ib = temp;
 }

 public static void swap(int li, int lj) {
  int temp = li;
  li = lj;
  lj = temp;
 }

 public static void change(StringBuffer ia) {
  ia.append(", but my content can be changed");
  //ia = new StringBuffer(",but my content can be changed");
 }
}

输出:

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中的对象类型的值传递),可以通过*操作,改变指针指向的值。示例程序如下,一看便知:

#include<iostream.h>

int main(){
 void test(int*, const char*);
 int i = 1;
 int* iptr = &i;
 cout<<"Before pass-by-value:"<<"/n/n";
 cout<<"i = "<<i<<", It's value of i"<<endl;
 cout<<"&i = "<<&i<<", It's address of i and value of iptr"<<endl;
 cout<<"*iptr = "<<*iptr<<", It's value of i"<<endl;
 cout<<"iptr = "<<iptr<<", It's value of iptr and address of i"<<endl;
 cout<<"&iptr = "<<&iptr<<", It's address of iptr-self"<<"/n/n";
 
 test(iptr, "pass-by-iptr");

 test(&i, "pass-by-&i");

 return 0;
}

void test(int* iiptr, const char* string){
 cout<<"When pass-by-value and :"<<"/n/n";
 cout<<"*iiptr = "<<*iiptr<<", It's value of i"<<endl;
 cout<<"iiptr = "<<iiptr<<", It's value of iiptr and address of i"<<endl;
 cout<<"&iiptr = "<<&iiptr<<", It's address of iiptr-self, different with iptr!"<<"/n/n";
}

输出:

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)。见如下示例:

#include<iostream.h>
int main(){
 void test(int&, const char*);
 int i = 1;
 int &iref = i;
 cout<<"Before pass-by-reference:"<<"/n/n";
 cout<<"i = "<<i<<", It's value of i"<<endl;
 cout<<"&i = "<<&i<<", It's address of i and value of iptr"<<endl;
 cout<<"iref = "<<iref<<", It's value of iref and value of i"<<endl;
 cout<<"&iref = "<<&iref<<", It's address of iref-self, the same as i!"<<"/n/n";
 
 test(iref, "pass-by-iref");

 test(i, "pass-by-i");

 return 0;
}

void test(int &iiref, const char* string){
 cout<<"When pass-by-reference and "<<string<<"/n/n";
 cout<<"iiref = "<<iiref<<", It's value of iiref and value of i"<<endl;
 cout<<"&iiref = "<<&iiref<<", It's address of iiref-self, the same as i!"<<"/n/n";
}

输出:

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字符串函数比较

赋值拷贝: #include #include using namespace std; void main(){ string a="hello world!"; string b; /...
  • iamgaowei
  • iamgaowei
  • 2014年08月04日 14:57
  • 2526

【C/C++】三种在C++里定义比较函数的方法

参考自:3 Ways to Define Comparison Functions in C++ STL里有不少东西需要比较函数,例如 sort(),set,priority_queue...
  • woxiaohahaa
  • woxiaohahaa
  • 2016年11月17日 21:45
  • 1474

C++ 自定义比较:仿函数、函数与重载操作符

cpp 模板泛型编程cpp 比 c 方便不少不光因为其支持面向对象支持class,同样还因为其支持泛型编程,有方便的STL库。泛型要比宏强大的多,是一种设计更巧妙的编译期动态机制,类型安全,使得一些通...
  • thisinnocence
  • thisinnocence
  • 2016年04月04日 20:31
  • 2146

[C++]高效定义STL比较函数的一些建议

函数与函数子 在STL的使用中,我们经常需要自定义比较函数。本文将介绍如何完成这一类的函数,并且给出可靠而高效的使用建议。 1. mem_fun, ptr_fun, mem_fun_ref m...
  • stary_yan
  • stary_yan
  • 2016年07月18日 14:46
  • 1403

C++实现软件版本号比较

软件版本号的检查和比较是我们经常要用到的一个功能,我自己写了一个函数,用起来还是挺方便的。 // 函数功能:执行字符串形式的版本比较 // 返回值:比较成功返回真,比较失败返回假 // ...
  • ccpw_cn
  • ccpw_cn
  • 2015年03月31日 10:38
  • 1865

文件比较函数diff

作为一个程序员,调试
  • DaiHaoC83E15
  • DaiHaoC83E15
  • 2014年08月13日 17:11
  • 1057

STL sort算法中的比较函数

排序,既陌生又熟悉的名词。排序,成为面试官中喜欢问的算法问题。c++ STL中为我们提供了std::sort, 所以今天我们不是来描述各种排序算法的实现,而是看看怎么使用stl为我们提供的sort。先...
  • wangshubo1989
  • wangshubo1989
  • 2016年10月13日 13:12
  • 20188

C++ 优先队列用法自定义Compare函数

C++头文件 #include template              typename _Sequence = vector,              typename _Co...
  • tangzhenyu2022
  • tangzhenyu2022
  • 2015年07月28日 07:43
  • 1657

浅谈C/C++排序函数中cmp()比较函数的写法

首先,我们来谈谈大名鼎鼎的void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *)); 它属于C...
  • Lionel_D
  • Lionel_D
  • 2014年12月05日 12:46
  • 13856

Java和C++的一些比较

1. 前言: 最近公司的项目主要偏重于B/S模式的项目,因此主要使用Java和JavaScript语言分别做后台和前台的编码工作。相较于之前项目中一直在用的C++语言,还是体会到了Java和C++存...
  • inter_peng
  • inter_peng
  • 2015年04月06日 12:49
  • 3459
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java与C++函数参数传递比较——C++学习笔记一
举报原因:
原因补充:

(最多只允许输入30个字)