C++中引用定义形式一般如下:
类型 &变量 = 目标变量
引用相当于是目标变量的一个别名,对引用的操作与对目标变量的直接操作相同。
引用只是相当于目标变量的一个别名,内存中不会给引用分配存储空间。
引用在声明时进行初始化,引用一旦声明之后,就不可以再指向其它的目标对象。
例:
int & a ; //错误,引用在声明时,必须进行初始化
int b = 10;
int c = 30;
int & rb = b //定义b的引用rb
rb = c; //错误,引用在声明之后,不能再指向其它的变量
int *pb = & b;
int &*rpb = pb; //声明指针pb的引用rpb
cout << &b<<endl; //输出变量b的地址,假定结果为0013FF80
cout << &rb<<endl; //声明只是相当于变量的别名,因此输出的结果仍为0013FF80
cout << rb << endl; //10
cout << *pb <<endl; //10
rb + = 10;
cout << rb <<endl; //20
cout<< *rpb << endl; //20
注意:1、不能对void类型的进行引用。例:void &ra = 3 错误。
2、不能对数组建立引用。
例: int a[10];
int &ra = a; 错误
因为数组名是数组空间的首地址,其本身并不是一个数据类型。
3、不能声明引用的引用
因为引用本身不是一个数据类型,因此没有引用的引用
4、没有空引用,例 int &r = NULL; 错误
关于常引用,从网络上搜了一些简单说明,目前还是没有理解。
这里再来专门总结一下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;
将“引用”作为函数返回值的类型,例:
int &max(int &a, int &b)
{
renturn a>b ? a:b;
}
max()函数返回一个整型的引用,那么max()这个函数也是a和b中较大者所引用对象的引用。如果a = 3, b = 4,那么max()就是b所引用对象的引用。然后我们执行 max(a, b)++ ,效果就是b的值变为5 。
使用该方法的好处是在内存中不用产生返回值的内存对象。