1 Java
Java中方法(函数)的参数传递只有按值调用一种方式。只是在方法内部产生了一个参数的拷贝。
方法参数分为两种:
1.基本数据类型。方法无法修改参数的值。
2.对象引用。假设一个类Employee有一个raiseSalary的方法,在tripleSalary函数中调用该方法。
public static void tripleSalary(Employee x){
x.raiseSalary(200);
}
harry = new Employee(...);
tripleSalary(harry);
在函数内部会将x初始化为harry值的拷贝,此时harry和x都指向了那个Employee对象,当使用raiseSalary方法时,对象也会产生改变。
但是需要注意的是,这个拷贝指向的是原对象,产生的操作也是针对原对象的,类似于C语言中传入一个指针,通过指针操作其指向的对象。而根据指针只能找到指针指向的内容,不能改变指针;同样,根据这个拷贝也只能找到它引用的对象,不能改变原参数使其引用一个新的对象。
如果在方法(函数内部)改变了拷贝指向的对象,在离开函数时,由于是传值调用,并不会对原来的对象引用产生任何影响。
定义一个交换对象的方法:
public static swap(Employee x, Employee y){
Employee temp = x;
x = y;
y = temp;
}
Employee a = new Employee("Alice",...);
Employee b = new Employee("Bob",...);
swap(a,b);
这个方法只能交换拷贝x和y,不能改变存储在变量a和b中的对象引用,在方法返回后,x和y也被丢弃了,不会产生任何影响。
2 C++
引用(reference)为对象起了另外一个名字,引用类型引用(refers to)另外一种类型。
通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名
C++中除了按值传递,还有一种按引用传递的方式。传入函数的形参相当于是对象的别名,在函数中的操作和对原对象的操作是等同的。通过这种方式可以轻松实现swap的功能:
void swap(T &a, T &b){
T temp = a;
a = b;
b = temp;
}
参考
《Java核心技术 卷1》
《C++ primer 中文版 第5版》