总览
主要讲了 c++ 中引用的的语法、注意事项、使用方法及其本质
基本使用
作用:给变量起别名 语法:数据类型 &别名 = 原名
c++
#include <iostream>
using namespace std;
int main() {
int a = 10;
// 起别名
int &b = a;
// 结果都为 10
cout << a << endl;
cout << b << endl;
// 修改别名也会影响原变量
b = 20;
// 结果都为 20
cout << a << endl;
cout << b << endl;
return 0;
}
引用的注意事项
- 引用必须初始化
- 引用初始化后,不可以改变
c++
#include <iostream>
using namespace std;
int main() {
int a = 10;
// 错误:引用必须初始化
//int &b;
int &b = a;
int c = 20;
// 引用在初始化后,不可以改变
//&b = c;
cout << b << endl;
return 0;
}
引用做函数参数
作用:函数传参时,可以利用引用让形参修饰实参(也就是通过形参修改实参)
优点:之前形参修饰实参只能通过指针来进行,引用可以简化指针
c++
#include <iostream>
using namespace std;
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;
}
int main() {
int a = 10;
int b = 20;
// 方式一:值传递
// 无交换 10, 20
swap01(a, b);
cout << a << " " << b << endl;
// 方式二:指针传递
// 交换 20, 10
swap02(&a, &b);
cout << a << " " << b << endl;
// 方式三:引用传递
// 10, 20 重新交换回来
swap03(a, b);
cout << a << " " << b << endl;
return 0;
}
引用做函数返回值
c++
#include <iostream>
using namespace std;
int& test01() {
int a = 5;
return a;
}
int& test02() {
static int a = 10;
return a;
}
int main() {
// 不要返回局部变量引用
int &res = test01();
// 第一次结果是 10,因为编译器做了一次保留
cout << res << endl;
// 第二次结果错误,a 的内存已经在函数调用完后释放
cout << res << endl;
int &res2 = test02();
// 两次都是 10
cout << res2 << endl;
cout << res2 << endl;
test02() = 1000; // 如果函数的返回值是引用,那么函数调用可以作为左值
cout << res2 << endl;
cout << res2 << endl;
return 0;
}
引用的本质
引用的本质:在 c++ 内部实现是一个指针常量
指针常量:根据前面的定义即指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化
只要用到引用,编译器就会自动进行解引用的操作
c++
#include <iostream>
using namespace std;
int main() {
int a = 10;
// 其实执行的时候转换为 int* const ref = &a; 指针常量是指针指向不可改,也说明了为什么引用不可更改
int& ref = a;
ref = 20; // 内部发现 ref 是引用,自动帮我们转换为 *ref = 20;
// 值可以修改,通过 ref 这个引用修改了 a 的值
cout << a << endl;
cout << ref << endl;
return 0;
}
结论:c++中推荐使用引用技术,因为语法方便。引用的本质是指针常量,但是所有的指针操作编译器都帮我们做了。
常量引用
作用:主要用来修饰形参,防止误操作
在函数形参列表中,可以加 const 修饰形参,防止形参改变实参
c++
#include <iostream>
using namespace std;
void show(const int &val) {
// 重新赋值后,打印结果为 1000
// 如果不加 const 的话,会影响原数字b
// 如果代码过长可能会误操作,所以直接加 const 防止形参修改实参
// val = 1000;
cout << val << endl;
}
int main() {
int a = 10;
// int & ref = 10; // 引用必须引一块合法的内存空间,10是字面量不可以引用
const int & ref = 10; // 加了 const 之后,编译器发力。int tmp = 10; const int & ref = tmp;
//ref = 20; //const变为只读,不可以修改
int b = 100;
show(b);
cout << b << endl;
return 0;
}