Skip to content
On this page

CPP_引用


标签:CPP/基础  

概念

  • 相当于起别名

定义引用

  • 格式: 数据类型 &引用名 = 引用目标
  • 定义引用的时候,必须初始化
  • 一个目标可以定义多个引用
  • 注意:
    • 引用类型必须和目标类型匹配
    • 引用不重新分配内存空间,与目标是用一个空间
    • 引用的使用和普通变量使用一样
    • 引用一旦使用,就不能在更改它的值(引用目标)
  • & 引用左值,&& 引用右值

作为形参

  • 引用作为函数签名中的形式参数,获得的是实际的地址,会修改调用函数传入的变量
  • 效果类似指针的传递,但它在函数内部的使用方式和一般形式参数一样
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 访问,但不能修改

引用作为结构体的成员

  • 引用作为结构体的成员的时候,在结构体初始化的时候,必须将该字段进行初始化

引用和指针的区别

  1. 引用是目标本身,指针是目标地址
  2. 用法一致,但指针需要 * 运算符
  3. 引用的地址和目标一致,但指针有自己的地址
  4. 引用必须初始化,指针可以只声明
  5. 引用指定后不能改变,指针可以修改
  6. 引用不占用额外内存,通过别名的方式映射到原变量,指针会占用 4/8 字节大小
  7. 指针有多级指针,但引用没有多级
  8. 可以定义指针数组,但没有引用数组

Last updated: