对一个数据可以使用“引用”(reference),这是C++对C的一个重要扩充,引用是一种新的变量类型,它的作用是为一个变量起一个别名。假如有一个变量a,想给它起一个别名b,可以这样写:
int a; //定义a是整型变量
int &b=a; //声明b是a的引用
注意: 在上述声明中,&是引用声明符,并不代表地址。不要理解为“把a的值赋给b的地址”。声明变量b为引用类型,并不需要另外开辟内存单元来存 放b的值。b和a占内存中的同一个存储单元,它们 具有同一地址。声明b是a的引用,可以理解为: 使变量b具有变量a的地址。如果a的值是20,则b的值也是20。
在声明一个引用类型变量时,必须同时使之初始化,即声明它代表哪一个变量。在声明变量b是变量a的引用后,在它们所在函数执行期间,该引用类型变量b始终与其代表的变量a相联系,不能再作为其他变量的引用(别名)。下面的用法不对:
int a1,a2;
int &b=a1;
这种传递方式和使用指针变量作形参时有何不同:
(1)使用引用类型就不必在swap函数中声明形参是指针变量。指针变量要另外开辟内存单元,其内容是地址。而引用变量不是一个独立的变量,不单独占内存单元,在例6.20中引用变量a和b的值的数据类型与实参相同,都是整型。
引用作为函数参数
有了变量名,为什么还需要一个别名呢?C++之所以增加引用类型, 主要是把它作为函数参数,以 扩充函数传递数据的功能。
#include <iostream>
using namespace std; int main()
{
void sort(int &, int &, int &);
int i, j, k;
cin >> i >> j >> k;
sort(i, j, k);
cout << i << " " << j << " " << k << endl;
return ;
} void sort(int &i, int &j, int &k)
{
void change(int &a, int &b);
if(i > j) change(i, j);
if(i > k) change(i, k);
if(j > k) change(j, k);
} void change(int &a, int &b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}