引用的作用是给一个变量起一个别名,例如有一个变量a,想给他起一个别名b,可以写成:int a; ? ?int ? &b=a; ? ? ? ?
这样声明后,代表a和b就是同一变量单元,而&不是代表取地址符号,而是引用声明符,说明定义了b可并没有为它另开辟内存单元,b和a就是同一变量。
?
?
?
?
先看一个例子。
?
?
#include "stdafx.h" #include <iostream> using namespace std; //注意形式参数 void swap(int a,int b) { int temp; temp=a; a=b; b=temp; } int main(int argc, char* argv[]) { int i=3,j=5; swap(i,j); cout<<"i="<<i<<endl; cout<<"j="<<j<<endl; return 0; }
?
结果如图:
可以看出虽然我们在main函数中调用了swap函数,但是i,j的值并未发生改变。
为什么呢?因为普通的函数过程调用,只有实际参数向形式参数传值,而形式参数无法改变实际参数的值。对于普通的函数调用,主调函数接受的来自被调函数的信息,最多只是被调函数的返回值。即被调函数向主调函数最多只能传递1个数据。
上面的例子中,被调函数中,形参a,b本来是3,5,后来变为5,3。但是它们无法让实际参数i,j知道这些改变,所以i,j的值并未发生改变。
?
我们只讲swap函数的形式参数改变一下。
将
?? ?void swap(int a,int b);
改为
?? ?void swap(int& a,int &b);
这样就可以使得i,j变为5,3。输出如下:
?
?
下面来讲解一下这样修改的原理。
?
?
函数调用:当需要在一个函数(称为主调函数)中使用另一个函数(称为被调函数)实现的功能时,便以函数名字进行调用,成为函数调用。被调函数间同主调函数交换信息(有时候被调函数不需要向主调函数传递信息,比如被调函数中只有cout语句)的方法有2种:一种是由被调函数把返回值返回给主调函数,另一种是通过参数带回信息。函数调用时实参和形参间交换信息的方法有传值调用和引用调用两种。
1)传值调用CallByValue:函数调用时以实参向形参传递相应类型的值。(这种方式下形式参数不能向实际参数传递信息!)
2)引用调用CallByReference:当形参为引用类型时,函数中对形参的访问和修改实际上就是对相应的实参的访问和修改
?
然后说说引用存在的价值,引用的出现主要是把它作为函数参数,以扩充函数传递数据的功能。用传递变量别名的方法实现函数传递数据。
?
?