1. 引用传递
在C++中值传递可以实现单向传递,但是引用传递可以实现双向传递。
引用类型
- 引用(&)是标识符的别名
- 例如:int i, j ; int & ri = i; //定义int引用ri,并初始化为变量i的引用。
- 定义一个引用时,必须同时对他进行初始化,使它指向一个已存在的对象。
j = 10
ri = j; //相当于是i=j
- 一旦一个引用被初始化后,就不能改为指向其他对象
- 用途:引用可以作为形参
2. 一个例子
输入两个整数交换后输出(值传递)
#include <iostream>
using namespace std;
void swap(int a, int b){
int t = a;
a = b;
a = t;
}
int main()
{
int x = 5, y = 10;
cout << "x = " << x << " y = " << y << endl;
swap(x, y);
cout << "x = " << x << " y = " << y << endl;
system("pause");
return 0;
}
该程序试图交换两个变量的值,但是发现这两个值并没有交换,程序执行过程见下图,用实参去初始化形参,在子函数中交换了两个值,但是由于参数只能是单向的,也就是说只能将实参传给形参,而不能将形参传给实参,所以并没有达到交换两个变量值的效果。
输入两个整数交换后输出(引用传递)
#include <iostream>
using namespace std;
void swap(int &a, int &b){
int t = a;
a = b;
a = t;
}
int main()
{
int x = 5, y = 10;
cout << "x = " << x << " y = " << y << endl;
swap(x, y);
cout << "x = " << x << " y = " << y << endl;
system("pause");
return 0;
}
程序仅仅修改了子函数中的参数列表,加入了&,此时这两个参数表示的是两个引用变量,a就可以看成是变量的别名,定义的时候并没有为变量分配存储空间,只有在函数被调用时才为变量分配存储空间,程序执行过程见下图:
主函数中在调用子函数时,虽然x,y在子函数中看不到,但是他们的别名a,b在子函数中确是能够看得见的,所以在子函数中实质上就是用a,b来操纵x,y,这就是引用做函数参数,实现的双向传递的效果。