6.4.5 引用传递
在第4章中已经提及,对变量的引用相当于变量的别名,以“int&m=n;”为例,对m的操作实质上就是对n的操作,例如湖南省的简称是湘,湘就可以被认为是湖南省的引用,新闻标题上说“湘发生……”实质上等价于“湖南省发生……”。所以说,m既不是n的副本,也不是指向n的指针,m就是n本身。
C++允许函数通过引用实现参数传递。在调用函数时,不会再为形参分配内存空间,因为此时的形参就是实参本身,在函数中对形参进行的任何操作,本质上都是对调用函数中的实参进行的操作,见代码6.8。
代码6.8 引用传递CallByRef
<—————————————-文件名:example608.cpp—————————————-> 01 #include<iostream> 02 using namespace std; 03 int main() 04 { 05 void change(int&,int&);//change()函数声明,传递的是引用 06 int x=2,y=3; 07 cout<<"变量x的地址是:"<<&x<<endl; 08 cout<<"交换前:x="<<x<<",y="<<y<<endl; 09 change(x,y);//change()函数调用 10 cout<<"交换后:x="<<x<<",y="<<y<<endl; 11 return 0; 12 } 13 void change(int&n,int&m)//change()函数定义 14 { 15 int temp; 16 temp=n; 17 n=m; 18 m=temp; 19 cout<<"形参n的地址是:"<<&n<<endl; 20 }
输出结果如下所示。
变量x的地址是:0013FF7C 交换前:x=2,y=3 形参n的地址是:0013FF7C 交换后:x=3,y=2
【代码解析】代码第9行,通过change()函数的引用传递实现了x和y数值的互换,从输出的实参x和形参n的地址可以看出,两者对应同一片内存区域,是一回事。这说明在调用函数change()时,并没有给形参m和n分配内存空间,而直接是对实参进行操作的。
不论是传递参数还是作其他用,如果仅仅需要使用某个程序实体的“别名”,推荐用引用,而不是指针,虽然引用能做的事,指针完全也可以做到,但是指针的功能太过强大,能毫无约束地对内存进行任何操作,这是十分危险的。引用的使用虽有很多的限制,但这也大大降低了程序出错的可能性。如果把指针比作一把刀,这把刀既能砍瓜切菜,又能理发剪指甲,若不怕危险,或许还能剔牙,这种万能刀用起来是会经常出问题的,而引用可能就是一把指甲剪,不能拿来切菜,但指甲剪是可以放心使用的,不会带来这样或那样的危险。
注意
用适当的工具做恰如其分的事。