引用作为函数参数(按引用传递),使得函数中的变量名成为调用程序中的变量的别名。
即我们可以操作到调用程序中的变量,而单纯的值传递只能影响到函数中变量,而无法影响到调用程序中的变量。
看下面一个简单的值交换例子:
#include <iostream>
void swapr(int &a, int &b);
void swapp(int *p, int *q);
void swapv(int a, int b);
int main() {
using namespace std;
/* 原来两个钱包所包含的钱数 */
cout << "原来:";
int wallet1 = 300;
int wallet2 = 400;
cout << "wallet1 = $" << wallet1;
cout << " wallet2 = $" << wallet2 << endl;
/* 按引用传递 */
cout << "引用:";
swapr(wallet1, wallet2);
cout << "wallet1 = $" << wallet1;
cout << " wallet2 = $" << wallet2 << endl;
/* 按指针传递 */
cout << "指针:";
swapp(&wallet1, &wallet2);
cout << "wallet1 = $" << wallet1;
cout << " wallet2 = $" << wallet2 << endl;
/* 值传递 */
cout << "传值:";
swapv(wallet1, wallet2);
cout << "wallet1 = $" << wallet1;
cout << " wallet2 = $" << wallet2 << endl;
return 0;
}
/**
* 使用引用传参
*/
void swapr(int &a, int &b) {
int temp;
temp = a;
a = b;
b = temp;
}
/**
* 使用指针传参
*/
void swapp(int *p, int *q) {
int temp;
temp = *p;
*p = *q;
*q = temp;
}
/**
* 使用值传参
*/
void swapv(int a, int b) {
int temp;
temp = a;
a = b;
b = temp;
}
程序运行结果:
原来:wallet1 = $300 wallet2 = $400
引用:wallet1 = $400 wallet2 = $300
指针:wallet1 = $300 wallet2 = $400
传值:wallet1 = $300 wallet2 = $400
由此可见,引用和指针传递改变了wallet1和wallet2的内容,而值传递值交换失败。事实上,值传递改变的是函数中a与b的值。
从传参开始,swapv函数就创建了两个变量a与b,wallet1和wallet2的值赋值给了a与b,所有该函数并没有对wallet1和wallet2作出改变。