10.2 引用做函数参数
引用做函数参数跟地址传递一样,可以通过形参改变实参。
这里写三个函数,分别为值传递、地址传递、引用传递,对比其中的不同。
#include <iostream>
using namespace std;
//1、值传递
void swap1(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
//地址传递
void swap2(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
//引用传递,也可以修改实参
void swap3(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
int main()
{
int x = 10;
int y = 20;
swap1(x, y);
cout << "值传递x=" << x << endl;
cout << "值传递y=" << y << endl;
swap2(&x, &y);
cout << "地址传递x=" << x << endl;
cout << "地址传递y=" << y << endl;
swap3(x, y);
cout << "引用传递x=" << x << endl;
cout << "引用传递y=" << y << endl;
}
值传递没有改变a和b的值,地址传递交换了a和b,最后的引用传递又将a和b交换了回来。
为什么引用传递也会改变实参的值?
在调用引用传递函数时,传递参数相当于下面两个步骤:
int &a = x;
int &b = y;
这样形参a相当于x的别名,对形参的操作本质是在操作实参,所以能对实参产生影响。