// Java和C++的参数传值上存在共同的地方,也有不同的地方
// Java 只有传值 , 而C++ 则既有 传值 也有传 引用
// 因此 C++ 可以对地址值进行操作
// 来看个 Java 例子
public class MethodParameterTest {
public static void main(String[] args) {
List<String> aa = new ArrayList<String>();
List<String> bb = new ArrayList<String>();
aa.add("hi");
bb.add("hello");
swapandinc(aa,bb); // 这里把 aa和 bb 这两个对象的地址值传到 swapandinc 方法
System.out.println("after swapandinc, aa: "+aa);
System.out.println("after swapandinc, bb: "+bb);
}
static void inc(List<String> a, List<String> b) {
a.add(" world");
b.add(" world");
}
static void swapandinc(List<String> a, List<String> b) {
// java 中堆栈的概念,进入到方法,会把操作数等压入栈
// 此时,a 和 b 形参是两个新的对象,各自保存着 main 方法里传进来的 aa 和 bb 的地址值
// 也就是 a 、aa 指向的是同一个内存空间,而 a、aa两者自身处于不同的内存空间。(a 、aa 都是保存地址的对象)
System.out.println("before swapandinc, a: "+a);
System.out.println("before swapandinc, b: "+b);
List<String> tmp = a;
a = b;
b = tmp;
inc(a,b);
System.out.println("after swapandinc, a: "+a);
System.out.println("after swapandinc, b: "+b);
}
}
// 输出结果就可以明显的看到 java 传值的特性 了
// 在 swapandinc 方法里,对 a 和 b 对象进行交换,本质上只是将两者保存的地址进行了交换
// 而 由于 a、b 与 main方法的aa、bb 是分别保存同一个地址的不同对象
// 因此 a 和 b swap行为并不影响 aa、bb 两者所指向的内存空间
// 而在inc 方法里,直接对 a 和 b 他们所指向的对象进行了操作,因此也会影响到 aa、bb 两者所指向的内存空间
output:
before swapandinc, a: [hi]
before swapandinc, b: [hello]
after swapandinc, a: [hello, world]
after swapandinc, b: [hi, world]
after swapandinc, aa: [hi, world]
after swapandinc, bb: [hello, world]
// 下面再看个 C++ 的例子
// 同样的,在C++ 中,如 swap 和 inc 方法所示,传值对于形参与实参,也是两份空间,指向同一份空间
// 对形参的 swap 不会影响实参,但是若对形参所指向的内存空间进行操作则会影响实参
// 而swap1 和 inc1 方法则展示的是C++的引用传值,形参相当于实参的引用,对形参的任何操作都会影响到实参
#include<stdio.h>
void swap(int *a1,int *b1){ // 这是个传值操作
int *t=a1;
a1=b1;
b1=t;
}
void inc(int *a, int *b) { // 这是个传值操作
(*a)++;
(*b)++;
}
void swap1(int *&a1,int *&b1){ // 这是C++的引用传值
int *t=a1;
a1=b1;
b1=t;
}
void inc1(int *&a1,int *&b1){ // 这是C++的引用传值
(*a1)++;
(*b1)++;
}
int main(){
int x1=100;
int x2=200;
int *a=&x1;
int *b=&x2;
printf("%d %d\n",*a,*b);
swap(a,b);
printf("%d %d\n",*a,*b);
inc(a, b);
printf("%d %d\n",*a,*b);
swap1(a,b);
printf("%d %d\n",*a,*b);
inc1(a,b);
printf("%d %d\n",*a,*b);
return 0;
}
output:
100 200
100 200
101 201
201 101
202 102