- C++
引用到底是什么
- @ 2026-1-26 9:37:50
一、先搞懂:引用到底是什么?
可以把引用理解成变量的“别名”(外号)。就像一个人可以有大名和小名,不管叫哪个名字,指的都是同一个人。
举个生活中的例子:
- 变量
int a = 10;就像“张三”(大名) - 引用
int &b = a;就像“小三”(小名) - 不管修改
a还是b,都是修改同一个内存里的数值。
二、引用的基本语法(0基础也能写)
1. 引用的定义格式
数据类型 &引用名 = 原变量名;
&在这里不是“取地址符”,而是引用符号- 引用必须在定义时就初始化(必须立刻绑定到一个变量上,不能先定义再赋值)
- 引用一旦绑定某个变量,就不能再绑定其他变量(一辈子只认一个“本尊”)
2. 最简单的示例代码
#include <iostream>
using namespace std;
int main() {
// 1. 定义一个普通变量(本尊)
int num = 100;
// 2. 定义num的引用(别名)
int &ref_num = num; // 注意:&在这里是引用符号,不是取地址
// 3. 打印本尊和别名的数值
cout << "num的值:" << num << endl; // 输出:100
cout << "ref_num的值:" << ref_num << endl; // 输出:100
// 4. 修改别名,看看本尊会不会变
ref_num = 200;
cout << "修改ref_num后,num的值:" << num << endl; // 输出:200
// 5. 验证:本尊和别名的内存地址完全相同
cout << "num的地址:" << &num << endl; // 比如输出:0x7ffeefbff5ac
cout << "ref_num的地址:" << &ref_num << endl; // 输出和上面完全一样
return 0;
}
3. 错误示例(新手常踩坑)
#include <iostream>
using namespace std;
int main() {
// 错误1:引用定义时未初始化
// int &ref; // 编译器直接报错:引用必须初始化
// 错误2:引用不能绑定到常量
// int &ref = 10; // 报错,常量没有内存地址,无法别名
// 错误3:引用一旦绑定,不能更换绑定对象
int a = 10;
int b = 20;
int &ref = a;
ref = b; // 这不是更换绑定!而是把b的值赋给a(ref是a的别名)
cout << a << endl; // 输出20,证明a被修改了,ref还是a的别名
return 0;
}
三、引用的核心用途(为什么要用引用?)
引用最常用的场景有两个,都是为了解决实际开发中的问题:
1. 函数参数传递(避免拷贝,提高效率)
如果函数参数是普通变量,会生成一份拷贝(浪费内存);用引用作为参数,直接操作原变量,无拷贝开销。
示例:交换两个整数(用引用实现)
#include <iostream>
using namespace std;
// 引用作为函数参数:直接操作原变量
void swap(int &x, int &y) {
int temp = x;
x = y;
y = temp;
}
int main() {
int a = 10, b = 20;
cout << "交换前:a=" << a << ", b=" << b << endl; // a=10, b=20
swap(a, b); // 传入变量,函数内直接修改原变量
cout << "交换后:a=" << a << ", b=" << b << endl; // a=20, b=10
return 0;
}
对比:如果不用引用(用普通参数),交换会失败(因为修改的是拷贝,不是原变量):
void swap_error(int x, int y) {
int temp = x;
x = y;
y = temp;
}
int main() {
int a=10, b=20;
swap_error(a, b);
cout << a << "," << b << endl; // 还是10,20,交换失败
return 0;
}
2. 函数返回引用(返回变量本身,可链式赋值)
普通函数返回值是“拷贝”,返回引用则返回变量本身,支持链式操作。
示例:返回数组元素的引用
#include <iostream>
using namespace std;
int arr[5] = {1,2,3,4,5};
// 返回数组第n个元素的引用
int &get_arr_element(int n) {
return arr[n]; // 返回的是arr[n]本身,不是拷贝
}
int main() {
// 通过返回的引用修改数组元素
get_arr_element(2) = 99; // 等价于 arr[2] = 99
cout << arr[2] << endl; // 输出99
// 链式赋值(引用的特性)
get_arr_element(0) = get_arr_element(1) = 100;
cout << arr[0] << "," << arr[1] << endl; // 输出100,100
return 0;
}
⚠️ 注意:不能返回函数内局部变量的引用(局部变量在函数结束后会被销毁,引用会变成“野引用”,程序崩溃):
// 错误示例!
int &bad_func() {
int temp = 10;
return temp; // temp是局部变量,函数结束后销毁,引用失效
}
四、引用和指针的简单对比(新手不用深究,先记结论)
很多新手会混淆引用和指针,这里用表格简单区分:
| 特性 | 引用(别名) | 指针(地址) |
|---|---|---|
| 定义格式 | int &ref = a; |
int *p = &a; |
| 是否可空 | 不可空(必须绑定变量) | 可以为空(int *p = nullptr;) |
| 是否可重绑定 | 一旦绑定不能改 | 可以指向不同变量 |
| 使用方式 | 直接用(和变量一样) | 需要解引用(*p) |
新手结论:能用引用就先用引用,语法更简单、更安全(不会有空指针问题)。
总结
- 引用是变量的别名,和原变量共享同一块内存,修改引用就是修改原变量;
- 引用必须定义时初始化,且一旦绑定就不能更换绑定对象;
- 引用的核心用途是函数参数传递(避免拷贝、修改原变量)和函数返回引用(返回变量本身),是C++中提高效率和代码简洁性的重要工具。
如果看完还有不懂的地方(比如const引用、引用的底层实现),可以告诉我,我再针对性讲解~
1 条评论
-
admin SU @ 2026-1-26 10:03:23
#include<iostream> using namespace std; // 引用作为函数参数:直接操作原变量 void f(const int &x) { cout<<x*2<<endl; } int main() { int a = 100; f(a); return 0; }
- 1