概念:
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间
类型& 引用变量名(对象名) = 引用实体
int a=0;
int& b=a;
引用特性:
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用实体不能变更
- 常量的引用是常引用
int main()
{
int a = 0;
//int& b; 编译不通过
int& b = a;
int& rb = b;
int& rrb = a;
const int d = 0;
const int& rd = d;
const
return 0;
}
引用大小:
在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间
在底层实现上实际是有空间的,引用是按照指针方式实现的(汇编代码一样)
使用场景:
- 做别名
- 做函数参数
使用引用作为函数参数或者返回值,不会像传实参是发生拷贝,所以效率更高
- 做函数返回值
如果函数返回时,离开函数作用域后,其栈上空间已经还给系统,因此不能用栈上的空间作为引用类型返回(相当于一个野指针)。如果以引用类型返回,返回值的生命周期必须不受函数的限制(即比函数生命周期长)。
int Add(int& a,int& b)
{
return a+b;
}
int& Add(int& a)
{
return a++;
}
和指针的区别:
- 定义初始化;指针无要求
- 引用sizeof实体大小;指针sizeof指针大小
- 指针手动解引用;引用编译器自动解引用
- ++引用:++实体;++指针,地址偏移
- 没有多级引用;有多级指针
- 引用没有空引用,指针有空指针;引用比指针安全
- 引用在初始化时引用一个实体后,就不能再引用其他实体;指针可以在任何时候指向任何一个同类型实体