将引用用作函数参数
引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量别名(就是说,此时函数的形参和实参是同一个东西)。这种传递参数的方式称为 按引用传递 。按引用传递 允许被调用的函数访问调用函数中的变量(在函数的形参中去操作实参的别名(引用),就等于直接操作实参)。C++新增的这项特性是对C语言的超越,C语言除了指针传递的方式,只能按值传递。按值传递导致被调用函数使用调用程序的值的拷贝。
#include <iostream>
using namespace std;
void swapr(int &a,int &b);
void swapp(int *p,int *q);
void swapv(int a,int b);
int main()
{
int wallet1 = 300;
int wallet2 = 350;
cout << "wallet1 = " << wallet1 << endl;
cout << "wallet2 = " << wallet2 << endl;
cout << "Using references to swap contents:\n";
swapr(wallet1,wallet2);
cout << "wallet1 = " << wallet1 << endl;
cout << "wallet2 = " << wallet2 << endl;
cout << "Using pointers to swap contents again:\n";
swapp(&wallet1,&wallet2);
cout << "wallet1 = " << wallet1 << endl;
cout << "wallet2 = " << wallet2 << endl;
cout << "Tring to use passing by value:\n";
swapv(wallet1,wallet2);
cout << "wallet1 = " << wallet1 << endl;
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和wallet2正确交换。
按引用传递(swapr()),按值传递(swapv()),按地址传递(sawpp())。
swapr(wallet1,wallet2);
swapv(wallet1,wallet2);
其中swapr()和swapv()在使用的时候看起来相同。只能通过函数原型或者函数定义才能知道swapr()是按引用传递的。而地址运算符(&)使得按地址传递swapp(&wallet1,&wallet2)一目了然(类型声明int *p表明了,p是一个int指针,所以与p对应的参数应为地址)。
swapr()和swapv()的代码唯一的外在区别是声明函数参数的方式不同:
void swapr(int &a,int &b);
void swapv(int a,int b);
swapr()和swapv()内在区别:
在swapr()中,变量a和b是wallet1和wallet2的别名,所以交换a和b等于交换 wallet1和wallet2;但是在swapv()中,变量a和b是复制了wallet1和wallet2的值的新变量,因此交换了a和b的值并不会影响wallet1和wallet2的值。
比较函数swapr()(传递引用)和swapp()(传递指针)。第一个区别是声明函数参数的方式不同:
void swapr(int & a,int & b);
void swapp(int * p,int & q);
另一个区别是指针版本需要再函数使用p和q的整个过程中使用解引用运算符*。
应该在定义应用变量时对其进行初始化。函数调用使用实参初始化形参,因此函数的引用参数被初始化为函数调用传递的实参。也就是说,下面的函数调用将形参a和b分别初始化为wallet1和wallet2:
swapr(wallet1,wallet2);