引用最初的定义:引用是一种特殊类型的变量,可以认为是另一个变量的别名,通过引用名与通过被引用的变量名访问效果是一样的。
C++对指针进行简单封装引入了引用。
程序运行时,变量只能依靠地址来区别,只有通过存储被引用变量的地址,在运行时才能准确的定位引用的变量,引用本身占用的内存空间中,存储的就是被引用变量的地址。
c++在继承C语言指针的同时引入引用。指针存储的是地址,所以指针是一种底层机制。引用则是一种高层的机制,在语言概念上他是零一变量的“别名”,把地址这一概念隐藏起来,但是在引用运行的实现机制中,还是借用于地址,差异主要是语言上的形式,最后都是靠存储地址来实现的。
引用与指针的一个显著的差别,普通指针可以多次被赋值,也就是说 可以多次更改他所指向的对象,而引用只能在初始化时指定为引用的对象,其后是不可被更改的。
操作 | T类型的指针常量 | 对T类型的引用 |
定义并用v初始化(v是T类型变量) | T * const p=&v; | T & r=v; |
取v的值 | *p | r |
访问成员m | p->m | r.m |
读取v的地址 | p | &r |
引用本身(而非被引用对象)的地址是不可以获取的,引用一经定义后,对它的全部行为,全是针对被引用对象的,而引用本身所占用的空间则被完全隐藏起来了。
对于数据参数传递,减少大对象的参数传递开销的用途来说,引用可以更好的替代指针,使用引用比使用指针更加简洁、安全。
- 使用指针实现变量值的交换。
void swap(int *const pa,int *const pb){
int temp=* pa;
*pa = *pb;
*pb = temp;
}
int main(){
int a,b;
...
swap(&a,&b);
...
return 0;
}
- 使用引用实现变量值的交换。
void swap(int &ra,int &rb){
int temp=ra;
ra = rb;
rb = temp;
}
int main(){
int a,b;
...
swap(a,b);
...
return 0;
}
引用无法替代指针的情况。
- 如果一个指针所指向的对象,需要用分支语句加以确定,或者中途要改变它所指向的对象,那么它初始化之后需要被赋值,而引用只能在初始化时指定被引用的对象,所以不能胜任。
- 有时一个指针的值可能时空指针,例如当把指针作为函数的参数类型或者返回类型时,有时会用空指针表达特定的含义,而没有空引用之说,所以引用在这里不可以胜任。
- 使用函数指针,由于没有函数的引用,所以函数指针无法被引用替代。
- 用new动态创建的对象或者数组,需要用指针来存储它的地址。
- 以数组形式传递大批量的数据时,需要用指针类型接收参数。