void swap(int &rx,int &ry) { int temp=rx; rx=ry; ry=temp; }
运行结果为: before swap,X:5,y:6 after swap,x:6,y:5 在主函数中,调用swap()函数的参数是x和y,简单地传递变量而不是它们的地址。而事实上,传递的是它们的地址。引用传递的内存布局与指针相仿,只是操作完全不同。每当使用引用时, C++就去求该引用所含地址中的变量值,见图9-4: 引用具有指针的威力,但是调用引用传递的函数时,可读性却比指针传递好。引用具有传值方式函数调用语法的简单性与可读性,但是威力却比传值方式强。
图9-4 传递引用的内存布局
2.引用存在的问题
尽管引用可以表达清晰并让程序员负责了解如何传递参数,但是在有些情况下它们能隐藏错误。 例如,下面的代码在没有看到函数原型之前可能会误认为实参a和b是通过值来传递的,从而不能通过函数调用来修改它,而事实上却能够修改: int a=10; int b=20; swap(a,b); 因为引用隐藏了函数所使用的参数传递的类型,所以无法从所看到的函数调用判断其是值传递还是引用传递。正因为此,下面的代码中两个重载函数将引起编译报错: void fn(int s) { //... } void fn(int&t) { //... } void main() { int a=5; fn(a); //error匹配哪一个函数? }