引用(reference)有时候也称作别名(alias),它可以用作对象的另一个名字。通过引用我们可以间接地操纵对象,使用方式类似于指针,但是不需要指针的语法。
在实际程序中,引用主要被用作函数的形式参数--通常将类对象传递给一个函数。
引用必须被初始化。
- 语法:
int ival = 1024;
// ok: refVal 是一个指向ival的引用 int &refVal = ival;
- 引用除了可以引用变量,也可以引用指针:
int ival = 1024; int *pi = &ival; int *&ptrVal = pi;
- 一旦引用被定义,它就不能再指向其他的对象了。所以引用必须被初始化。 针对于引用的操作实际上全部应用在了它所指的对象身上了。
int ival = 1024; // ok: refVal 是一个指向ival的引用 int &refVal = ival; refVal += 2; //将refVal指向的对象ival加2 int ii = refVal; //把与ival相关联的值赋给ii int *pi = &refVal; //用ival的地址初始化pi
- 用常量来初始化引用时,必须使用const引用:
double dval = 3.14159; // 仅对于const引用才是合法的 const int &ir = 1024; const int &ir2 = dval; const double &dr = dval + 1.0;
===============================================
指针和引用的区别:
===============================================
1. 引用必须总是指向一个对象。
int *pi = 0; //用初始化pi——即,pi 当前不指向任何对象
//但是下面定义的引用 const int &ri = 0; //在内部发生了以下转换 int temp = 0; const int &ri = temp; //ri指向的是一个包含数值0的临时变量
2. 引用的赋值不同。如果用一个引用给另一个引用赋值,那么改变的是被引用的对象而不是引用本身。
- 指针:
int ival = 1024, ival2 = 2048; int *pi = &ival, *pi2 = &ival2;
pi = pi2;
//pi 指向的对象ival 并没有被改变。实际上pi被赋值为指向pi2所指的对象
重要的是现在pi和pi2都指向同一对象。(这是一个重要的错误源,如果我们把一个类对象拷贝给另一个类对象,而该类有一个或多个成员是指针。 后面会有更详细的讨论)。
- 引用:
int ival = 1024, ival2 = 2048; int &ri = ival, &ri2 = ival2;
ri = ri2;
//改变的是ival,而不是引用本身。赋值之后,两个引用仍然指向原来的对象
================================================
引用的实际使用
================================================
实际的C++程序很少使用上面程序中指向独立对象的引用类型。引用类型主要被用作函数的形式参数。
如下:
// 返回访问状态,将值放入参数 bool get_next_value( int &next_value ); int ival; while ( get_next_value( ival )) ... //以上的实参跟形参的绑定,实际上等价于以下语句 int &next_value = ival;