目录
1. 引用的基本使用
作用:给变量起别名
语法:
数据类型 &别名 = 原名
int a = 10;
int& b = a;
2. 引用的注意事项
- 引用必须初始化
- 引用在初始化后就不可更改
// 1. 引用必须初始化
int& b; //错误的,引用必须初始化
// 2. 引用初始化后就不可更改
3. 引用做函数参数
作用:函数传参时,利用引用让形参修饰实参(在效果上等同于地址传递)
优点:可以简化指针修改实参
//值传递
void swap01(int a, int b) {
int temp = a;
a = b;
b = temp;
}
//地址传递
void swap02(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
//引用传递
void swap03(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
通过引用传递参数产生的效果和通过地址传递参数产生的效果是一样的,但引用的语法更清楚简单。
4. 引用作为函数的返回值
引用可以作为函数的返回值存在
注意:不要返回局部变量的引用
用法:函数调用作为左值
int& test01() {
int a = 10; //存放在 栈区 函数结束后释放
return a;
}
int& test02() {
static int a = 10; //存放在 全局区 程序结束后,由系统释放
return a;
}
int main() {
int& a = test01();
cout << a << endl;
cout << a << endl;
test01() = 20; //如果函数的返回值是引用,这个函数的调用可以作为左值
cout << a << endl;
cout << a << endl;
return 0;
}
在上述的代码中,笔者测试结果不太符合预期,返回的局部变量的引用均不是乱码,测试编译器为Virtual Studio 2022。若有小伙伴能在留言处解答疑问,感激不尽。
5. 引用的本质
本质:引用的本质在 C++ 内部实现 是一个 指针常量(指针常量:指针的指向不可修改,但指针指向的值是可以修改的)
//编译器发现 ref 是引用,自动转换为:int* const ref = &a
void func(int& ref) {
ref = 100;
}
int main() {
int a = 10;
//自动传换成 int* const ref = &a; 指针常量是指针指向不可改,即引用初始化后不可更改
int& ref = a;
ref = 20;//编译器发现 ref 是引用,自动转换为: *ref = 20;
return 0;
}
C++推荐引用技术,因为语法方便,引用本身是指针常量,但是所有的指针操作都由编译器帮我们做了。
6. 常量引用
使用场景:用来修饰形参防止误操作。
// const 修饰形参 避免了误操作的发生
void func(const int& a){
a = 100; //编译错误,不允许更改其值
cout << a << endl;
}
笔者知识浅薄,如有错误和不足还请大佬指正。