java中参数传递只有值传递,与java不同,C++中的参数传递方式有三种,分别是 值传递 指针传递和引用传递,值传递和指针传递都知识传递当前参数的一个副本,而引用传递则是直接传递参数,所以在函数中改变参数的值就会有不同。
1.值传递
void replace(int i)//值传递
{
i = 10;//改变的是i副本的值
}
执行下面代码
int a = 5;
replace(a);
println(a);
这时候a的值还是5
ps:因为replace函数中的参数传递方式为值传递,实际上是传递的是i的一个副本,并非i本事,函数中改变i的值是改变的i副本的值,并不会影响到a
2.指针传递
void replace(int* i)//指针传递
{
*i = 10;//改变i所指向的内存
}
执行下面代码
int a = 5;
replace(&a);
println(a);
这时候a的值还是10
ps:replace中参数传递方式是指针传递,它也是和值传递一样,函数内部操作的是指针的副本,只不过这个副本和参数指针i都指向同一块内存块,所以在函数中操作副本指向的内存块就可以修改参数指针i所指向的内存块,a的值由5变10注意一下代码:
void replace(int* i)//指针传递
{
int a = 9;
i = &a;
}
执行下面代码int* n = NULL;
replace(n);
这时候n的值还是NULL
ps:如上面说的函数replace操作的是i的副本,函数内改变i的值只是改变了i副本的值,不会影响到n的值,所以n依然指向的是NULL
3.引用传递
void replace(int& i)//引用传递
{
i = 10;//改变实参的值
}
执行下面代码
int a = 5;
replace(a);
println(a);
a的值是10;ps:引用传递是传递实参本身,函数内操作的就是实参本身,不存在副本,在效率上也高于值传递
在很多程序中会存在以下代码:
bool sum(const int &a,const int &b);
这种参数一是限定了a和b的值在函数中不能被改变,二是省去了a,b拷贝副本的过程,如果a和b是比较大的类而不是基本数据类型效率会比较高