C++引用
在 C++ 中,引用 是一种特殊的变量类型,它为已存在的变量创建一个 “别名”(Alias)。引用本身不存储数据,而是与被引用的变量共享同一块内存空间,对引用的操作会直接作用于被引用的变量。引用的设计初衷是提供一种比指针更安全、更简洁的方式来间接访问变量。
一、引用的基本定义
1. 语法格式
引用的声明格式为:类型& 引用名 = 被引用的变量;
&在这里是 “引用符”(不是取地址符),表示声明一个引用。- 引用必须在定义时立即初始化,且一旦初始化后,就不能再绑定到其他变量(这是引用与指针的核心区别之一)。
2. 基础示例
int a = 10; |
- 上述代码中,
ref是a的别名,两者指向同一块内存,操作ref等价于操作a。
二、引用的核心特性
1.必须初始化,且不能重新绑定
- 引用在定义时必须绑定到一个已存在的变量,不能像指针一样先声明后赋值:
int& ref; // 错误!引用必须初始化
int b = 5;
int& ref = b; // 正确:初始化绑定到b - ==一旦绑定,引用不能再改为绑定其他变量==:
int c = 10;
ref = c; // 注意:这不是重新绑定!而是将c的值赋给ref(即b),此时b=10
2.引用本身不占独立内存(概念上)
- 引用的底层实现可能依赖指针(编译器通常用指针模拟引用),但从语法和语义上,引用被视为 “变量的别名”,不占用额外内存(标准未明确规定,但逻辑上可这么理解)。
- 因此,不存在 “空引用”(引用必须绑定到有效变量),这比指针更安全(指针可能为
nullptr)。
3.对引用的操作等价于对被引用变量的操作
- ==读取引用的值,就是读取被引用变量的值;修改引用的值,就是修改被引用变量的值==:
int x = 3;
int& rx = x;
rx += 2; // 等价于 x += 2 → x=5
int y = rx; // 等价于 y = x → y=5
三、引用的主要用途
A. 作为函数参数(引用传递)
这是引用的最常见和最重要的用途。使用引用作为函数参数可以达到以下目的:
- 修改实参: 允许函数修改调用者传入的实际变量的值。
- 避免复制(效率): 当传递大型对象(如结构体或类)时,使用引用可以避免将整个对象复制到函数栈中,从而提高效率。
// 传入引用,可以修改原始变量
void increment(int& num) {
num++;
}
int main() {
int count = 1;
increment(count); // 传递的是 count 的别名
// 此时 count 的值变成了 2
return 0;
}
B. 作为函数返回值
函数可以返回一个引用。这意味着函数调用表达式可以被视为一个左值(可以放在赋值号左边的值)。int global_array[] = {10, 20, 30};
// 返回一个数组元素的引用
int& getElement(int index) {
return global_array[index];
}
int main() {
// getElement(1) 返回了 global_array[1] 的引用,它是一个左值
// 相当于直接操作 global_array[1]
getElement(1) = 99;
// global_array 现在是 {10, 99, 30}
return 0;
}
⚠️ 注意: 永远不要返回局部变量的引用,因为局部变量在函数返回后会被销毁,返回的引用将指向一块无效的内存区域(悬空引用)。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 宇宙尽头的森林!