Appearance
概念
- 相当于起别名
定义引用
- 格式:
数据类型 &引用名 = 引用目标 - 定义引用的时候,必须初始化
- 一个目标可以定义多个引用
- 注意:
- 引用类型必须和目标类型匹配
- 引用不重新分配内存空间,与目标是用一个空间
- 引用的使用和普通变量使用一样
- 引用一旦使用,就不能在更改它的值(引用目标)
&引用左值,&&引用右值
作为形参
- 引用作为函数签名中的形式参数,获得的是实际的地址,会修改调用函数传入的变量
- 效果类似指针的传递,但它在函数内部的使用方式和一般形式参数一样
cpp
void swap1(int x, int y) {
int temp = x; x = y; y = temp;
}
void swap2(int &x, int &y) {
int temp = x; x = y; y = temp;
}
void swap3(int *x, int *y) {
int temp = *x; *x = *y; *y = temp;
}
int m = 520;
int n = 1314;
swap1(m, n);
swap2(m, n);
swap3(&m, &n);引用作为函数返回值
&返回值是一个左值,所以会出现fun() == xxx这种形式的表达式,在操作符重载中也比较常用;- 存在垂悬引用的问题,可以通过
static延长局部变量的生命周期(静态变量存放在静态区的.data段);
常引用
const int &ref = num定义常引用,其目标不是const变量:- 可以通过
&ref访问,但不能修改
- 可以通过
引用作为结构体的成员
- 引用作为结构体的成员的时候,在结构体初始化的时候,必须将该字段进行初始化
引用和指针的区别
- 引用是目标本身,指针是目标地址
- 用法一致,但指针需要
*运算符 - 引用的地址和目标一致,但指针有自己的地址
- 引用必须初始化,指针可以只声明
- 引用指定后不能改变,指针可以修改
- 引用不占用额外内存,通过别名的方式映射到原变量,指针会占用 4/8 字节大小
- 指针有多级指针,但引用没有多级
- 可以定义指针数组,但没有引用数组