引用的定义形式很简单,在对象声明时,在对象类型和对象名之间添加“&”来表明该变量是一个引用类型。例如:
int a = 10;
int &b = a;
这就定义了变量b是一种引用类型,且b是整数a的引用。
非常需要牢记的是:引用必须在定义时进行初始化!
在声明一个引用变量后,该引用就永久被“绑定”到的它所引用的变量。还举“鲁迅”的例子:自从周树人使用“鲁迅”这个笔名(引用)出名之后,大家提起鲁迅,都知道它代表着周树人,而不是其他人。而周树人是还可以有其他笔名的,因而某个对象也可以被多个其他对象引用。所以:
int a =10;
int &b = a;
int &c = a; 这样的引用是正确的。
那么,C++中引入“引用”有何目的?总结来说,主要有以下几方面作用:
1. 传递可变参数
在C语言中,函数在被调用时,参数传递采取的是“值传递”方式。变量值作为实参传递给形参,可是传递是单向的,即便形参在函数执行过程中发生了变化,也不会回传给实参,这主要是因为C中实参和形参不是同一个存储单元。所以形参的变化不会直接影响到实参。(通过某些间接的方式,如指针等手段还是能够实现形参影响实参的)。
而引入了“引用”后,使用引用类型作为形参,则形参和实参共享同一块内存单元,那么他们就能够互相影响了。这就便于实现某些功能了。
2. 提高参数传递效率
某些时候,我们可能会向函数中传入大型的对象作为参数,使用引用,不会创建副本,因而能够减少空间和时间上的消耗,提高函数效率。
3. 使用引用返回值
如果一个函数返回了引用,那么该函数的调用也可以被赋值。举个例子,如下函数:
int &max(int &a, int &b)
{
return a>b ? a : b;
}
max()函数返回一个整型的引用,那么max()这个函数也是a和b中较大者所引用对象的引用。如果a = 3, b = 4,那么max()就是b所引用对象的引用。然后我们执行 max(a, b)++ ,效果就是b的值变为5 。
4. 常引用
常引用是一个有点复杂拗口难解释的东西。首先关于c和c++中const的用法,就挺复杂的。以前写过一个总结,一共三篇,在这里:关于C/C++中的const的用法的总结 。
这里再来专门总结一下c++中常引用的用法:
const引用是指向const对象的引用。声明形式: const 类型标识符 &引用名 = 目标变量名;
例如:
const int val = 1000;
const int &ref1 = val; //Correct
int &ref2 = val; //Error
在上面的两个引用中,第一个是正确的,而第二个是错误的。因为val是const类型,一旦初始化不能再被赋值或修改,所以它的引用也必须是const类型来确保不会赋值。
还有一个常见的例子如下:
int a ;
const int &ref=a;
ref=1000; //Error
a=1000; //Correct
《C++ primer》第二章中对const引用的用法给出了很精辟的注释:
非const引用只能绑定到与该引用同类型的对象。
const引用则可以绑定到不同但相关的类型的对象或绑定到右值。
下面的引用是合法的:
int i = 1000;
const int &r1 = 500;
const int &r2 = r1 + i;
5. 多态
引用是除了指针另一个可以产生多态的方式。也就是说,一个基类的引用可以指向它的派生类的实例。
class A;
calss B: public A {..... };
B b;
A &ref = b;
在这里,ref只能访问派生类对象中从基类继承下来的成员。如果基类A中定义了虚函数,而派生类重载了这个虚函数,就可以通过ref实现多态。
--------------End-----------------
参考:
《c++ primer》(第四版),Lippman
《c程序设计》(第二版),谭浩强
c++引用,百度百科,http://baike.baidu.com/view/2129184.htm?fr=ala0_1