引用概念
引用:给已存在的变量取的别名
用法:引用类型& 引用名 = 实体名
exp:int& ra = a
(假设a已经定义)
特性
- 引用时在定义s时必须初始化
int& ra;
:错误
int& ra = a
正确 - 一个变量可以有多个引用
定义实体:int b = 1;
定义引用:int& r1 = b;
int& r2 = b;
int r3 = b
合法 - 引用只能引用一个实体
int& ra = a;
int& ra = b;
错误:引用ra已经有引用实体 - 引用和实体的类型必须一样
这一点在下面陈述
常引用
const int a = 10;
int& ra = a; //错误,因为a是一个常量,其内容不能改变
const int& ra = a //正确
//同样
int& rb = 10; //错误,b也是一个常量
const int& rb = 10;
总结:引用与实体的类型必须一致,实体是常量,引用也要是常量(const)类型的。
引用举例
作参数:
在swap函数中的形参x,y是两个引用,通过这两个引用可以达到不传地址也能在函数里面改变函数体外变量的值得效果。
做返回值:
int& TestFun(int& a){
a ++;
return a;
}
//注意:引用的生命周期一定要比函数的生命周期长,否则在函数返回的时候,引用就已经被释放
//例如:
int& TestFun2(int &a){
int b = a + 1;
return b;
}
//这里的b是栈上的空间,在函数返回时已经被释放
传值 传址 传引用的比较
传值与传引用:由于传值有一个实参到形参的临时拷贝过程,而引用不存在这个过程,因此在时间和空间上,传引用都要优于传值。当参数的占用空间较大时更为明显。
传址与传引用:直接给出结论,传引用比传址更安全。用引用的特性可以解释这一点:
- 引用在定义时必须初始化,而指针不用。
- 引用在引用一个实体后,不能再引用其他实体。而指针可以在任何时候指向任何一个同类型的实体。
- 访问实体方式时,指针需要显示解引用,而引用由编译器处理。