03 引用做函数参数
作用:函数传递参数的时候,可以使用引用来让形式参数修饰实际参数
优点:可以简化指针修改实际参数
我们可以回顾一下目前学习过的函数传递方式:
- 值传递:实参不会被修改,形参不可以修饰实参
- 地址传递:实参可以被修改,形参可以修饰实参。但是需要传递地址。
但是,我们使用引用的话,形参也可以修饰实参。
我们慢慢来。还是那个例子,交换两个数字。
-
值传递:
#include
using namespace std; void fun1(int a, int b); int main() { int a = 10; int b = 20; fun1(a, b); cout << "a =" << a << endl; cout << "b =" << b << endl; return 0; } void fun1(int a, int b) { int temp = a; a = b; b = temp; } 运行结果:
a =10 b =20
注意:值传递形参不可以修饰实参。
-
地址传递:
#include
using namespace std; void fun2(int* a, int* b); int main() { int a = 10; int b = 20; fun2(&a, &b); cout << "a =" << a << endl; cout << "b =" << b << endl; return 0; } void fun2(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } 结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
a =20 b =10
会发现,地址传递下,形参是可以修饰实参的。
-
引用传递:
这也是我们今天需要学习的。
#include
using namespace std; void fun3(int &a, int &b); int main() { int a = 10; int b = 20; fun3(a, b); cout << "a =" << a << endl; cout << "b =" << b << endl; return 0; } void fun3(int &a, int &b) { int temp = a; a = b; b = temp; } 结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
a =20 b =10
引用传递形参也会修饰实参。
仔细观察会发现,引用传递的自定义函数内的代码和值传递完全相同。唯一不同的是在声明函数的时候,值传递是:
void fun1(int a, int b);
而地址传递是这样的:void fun3(int &a, int &b);
。当函数内使用引用来接收传入值,形参就是实参的别名。所以在函数内的操作就会反应到函数外,也就是形参可以修饰实参。
(但是我还是建议学好指针......)
总结:通过引用传递参数的效果和地址传递是一样的(形参可以修饰实参)。但是引用传递的语法更简单。
:-)