引用

本质: 给变量起别名

语法:数据类型 &别名 = 原名

image-20230923153318392

使用注意:

  1. 引用必须初始化,如下使用是错误的:int &b;
  2. 引用在初始化后的指向就不可以发生改变,只能进行赋值操作

引用做函数参数

使用引用修饰函数形式参数,可以简化函数传参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void swap01(int a, int b)
{
// 值传递,并不会做实际交换
int tmp = a;
b = tmp;
a = b;
}

void swap02(int *a, int *b)
{
// 指针传递, 会做实际交换, 但是较为复杂
int tmp = *a;
*a = *b;
*b = tmp;
}

void swap03(int &a, int &b)
{
// 引用指向了对应的实际数据,所以会做出实际修改
int tmp = a;
b = tmp;
a = b;
}

引用做函数返回值

  1. 不要返回局部变量的引用
  2. 返回引用的函数可以作为左值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 用引用作为函数返回值
int & test01()
{
int a = 10; // 存放在栈
return a;
}

// 函数的调用可以作为左值
int & test02()
{
static int a = 10; // 静态变量放在全局区
return a;
}

int main(int argc, char const *argv[])
{
int &ref = test02();
//作为左值会修改其引用对应的变量
test02() = 1000;
cout << "ref = " << ref << endl;
cout << "ref = " << ref << endl;
cout << "ref = " << ref << endl;
return 0;
}

引用的本质

引用在C++内部实现是一个指针常量

1
2
3
4
//将int& 转化为 int* const ref = &a
void func(int& ref){
ref = 100; //ref是引用,转化为 *ref = 100
}

由于引用是一个指针常量,所以引用在初始化后就不可更改

常量引用

由于引用本身是一个指针常量,所以常量引用就是一个常量指针常量。不可以修改其值,也不可修改其引用

1
2
3
4
const int &ref = 10; 
//编译器修改为:
// int tmp = 10;
// const int &ref = tmp;

使用常量引用以防止传入的参数被误操作修改