学习C++ -> 引用( References )
2013-01-22 23:32 wid 阅读(5355) 评论(2) 编辑 收藏 举报学习C++ -> 引用( References )
一、引用的介绍
引用就是某一变量(目标)的一个别名, 相当于同一个人有了两个名字, 无论喊哪一个名字实际上都是指的同一个人。 同样, 在引用上, 对引用的操作与对变量直接操作的效果完全一样, 因此, 修改引用的值就是在修改变量的值。
从内存角度来说, 引用与变量名指向的都是同一处内存, 对引用地址的操作与对变量名地址的操作都是对同一处内存进行操作。 引用本身占用存储单元, 但是你没有办法从C++层面去访问到引用所占用的空间。
二、引用的声明
引用的声明方式与指针类似, 其形式如下:
类型标识符 &引用名 = 初始值 ;
& 为引用说明符, 表示该数据类型为引用类型。例如:
int n = 10 ;
int &rn = n ; //建立变量int型变量n的引用rn
float f ; //建立float型变量f的引用rf
float &rf = f ;
在声明一个引用时必须对引用进行初始化, 因为引用一经声明便无法修改, 不能声明一个未初始化的引用。例如:
int &rn ; //错, 未初始化
其次, 声明语句中的类型必须与初始值的变量类型一致, 像下面这样使用就是错误的:
int n = 10 ;
double &rn = n ; //错, 声明的引用类型为double, 而初始值的类型为int
三、引用使用初步
1>. 例: 使用引用进行值的输入与输出:
1 #include<iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 int n ; 8 int &rn = n ; //建立n的引用rn 9 10 cin>>rn ; //通过引用rn对变量进行赋值 11 cout<<"n="<<n<<", rn="<<rn<<endl ; //输出n与rn的值 12 13 return 0 ; 14 }
输出:
100 ↙键盘输入 n=100, rn=100 Process returned 0 (0x0) execution time : 2.094 s Press any key to continue.
在该程序中, 首先建立n的引用rn, 再通过引用rn对n的值进行赋值, 准确来说是通过rn对他们所指向的内存单元进行数据的写入。从输入以及输出结果来看, n与rn的值都是100, 也就再一次证明了对引用的任何操作都等价于对目标变量的操作。
2>. 建立指针的引用
对指针建立引用是合法的, 如:
int n = 10 ;
int *pn = &n ; //指向变量n的指针
int * &rpn = pn; //建立指针的引用
在建立指针的引用时需要注意 * 号与 & 符号的位置问题, int * &rpn = pn; *号在前, 这样是正确的; 如果把 * 号放在 & 符号后( int & *rpn = pn; ) 这样就是错误的, 编译器会报错。
3>. 对无名实体建立引用
C++允许对用new开辟的无名内存建立引用, 如:
int &r = *new int ;
在销毁所开辟的内存时, 可以使用 delete &r; 进行实现。
四、引用使用的一些限制
1>. 不能建立数组的引用
数组是由若干个元素组成的集合, 所以无法建立一个数组的别名。 从内存角度来说, 数组名只是代表一个内存单元的地址, 而引用需要的是一个内存单元的实体, 也就是说一次最多只能对该数组中的一个元素建立引用, 如:
int a[5] = {0} ;
//对数组名建立引用
int &r = a ; //错误, a不是实体
//对数组元素建立引用
int &r = a[2] ; //正确
2>. 不能建立引用的引用
一个变量可以有多个引用, 但C++规定不能对引用再建立引用:
int & &rr = r ; //错误, 不能建立引用的引用
五、指针与引用的比较
不同点:
1>. 指针可以被重新赋值, 而引用一经声明初始化便无法修改 ;
2>. 指针可以为空(NULL), 而引用不能 ;
3>. 指针在声明时可以不进行初始化, 而引用不能 ;
相同点:
都能直接对实体进行操作。
一般来说, 引用能做到的事指针都能做到, 但指针威力较大, 在使用不当的情况下指针错误通过会造成十分严重的后果, 风险较高。而引用则相对安全, 并且引用不会使用额外的存储单元。因此正确的使用引用可以提高代码变的健壮性, 使程序更高效的运行。
--------------------
wid, 2013.01.22