### 引用类型

引用是一个已存在对象的别名，一旦使用一个对象初始化引用对象之后，那么引用对象就成了目标对象的代名词。对引用对象进行操作，实际上就等于对目标对象进行操作，即使对引用对象使用取地址运算符“&”进行取地址运算，它将获取的是目标对象的地址。在 C++中定义引用对象的格式为：

数据类型 &引用别名 = 目标对象;

下面的语句定义一个整型变量，然后定义一个引用对象，将其初始化为整型变量。

int nKinds = 100; //定义一个整型变量

int& nRefKinds = nKinds; //定义一个引用对象，将其初始化为 nKinds

这样，引用对象 nRefKinds 就成了 nKinds 变量的别名，如果修改 nRefKinds 的值，将导致 nKinds 的值也会改变。

使用引用对象代替目标对象

#include "stdafx.h"

#include <iostream.h>

int main(int argc, char* argv[])

{

int nKinds = 100; //定义一个整型变量

int& nRefKinds = nKinds; //定义一个引用对象，将其初始化为 nKinds

cout << "nRefKinds 的值:" << nRefKinds << endl; //输出 nRefKinds

nRefKinds = 200;

cout << "nKinds 的值:" << nKinds << endl; //输出 nKinds

return 0;

}

运行程序，效果如图 1 所示。

图 1 使用引用对象

从图 1 中可以发现，当修改了引用对象 nRefKinds 的值，变量 nKinds 的值也发生了改变。因为引用对象 nRefKinds 被认为是变量 nKinds 的一个别名。如果我们另一个整型变量赋值给引用对象 nRefKinds 时，会发生什么情况呢？

int nKinds = 100; //定义一个整型变量

int& nRefKinds = nKinds; //定义一个引用对象，并初始化为 nKinds

int nCount = 500; //定义一个整型变量

nRefKinds = nCount; //为引用对象赋值

最后一行语句“nRefKinds = nCount;”实际上是对引用对象 nRefKinds 的目标对象赋值，使得变量 nKinds 的值为 500 和 nRefKinds 的值均为 500。而不是将引用对象 nRefKinds 的目标对象替换为 nCount 变量。

注意：引用对象只能在初始化时设置目标对象，其后对引用对象的操作实际上都是对目标对象的操作。

在定义引用对象时不能够将其初始化为一个字面常量或一个临时值。例如，下面的语句是错误的。

int & nRefLen = 3; //错误的语句

但是可以将常量引用初始化为字面常量或临时值，例如，下面的语句是合法的。

const int & nRefLen = 3; //合法的语句

int const & nRefLen = 3; //等同于 const int & nRefLen = 3;

这样，在程序中就不能够修改引用对象 nRefLen 的值了，因为目标对象是一个常量。

由引用的性质可以推断定义一个引用常量是没有意义的。因为自引用对象被初始化之后，用户再也没有办法重新为引用对象设置目标对象了，因此引用常量也就没有意义了，但是定义引用常量是完全合法的。例如：

int nData = 100; //定义一个整型常量

int &const nRefLen = nData; //定义引用常量对象，在逻辑上等同于 int & nRefLen = nData;