引用
在 C++ 中,除了指针之外,还有一个非常重要的概念——引用(Reference)。引用是 C++ 独有的语法(C 语言没有),它可以让我们更加安全、简洁地操作变量,尤其是在函数参数传递、返回值等场景下非常常用。
什么是引用
引用可以认为是变量的一个“别名”,你可以把它理解为给变量起了一个新的名字。通过引用访问变量时,实际上就是在操作原来的变量本身。
引用的定义语法如下:
<数据类型>& <引用名> = <变量名>;例如:
int a = 10;
int& ref = a; // ref 是 a 的引用(别名)此时,ref 和 a 指向的是同一个内存空间,无论通过 a 还是 ref 修改值,都会影响同一个变量。
ref = 20; // 等价于 a = 20;
cout << a << endl; // 输出 20引用与指针的区别
引用和指针虽然都可以用来间接访问变量,但它们有一些重要的区别:
- 指针可以为 nullptr(空指针),但是引用必须绑定到一个有效的变量。
- 引用一旦绑定到一个变量,就不能再更换指向,而指针可以随时重新指向其他变量。
- 访问引用时不需要解引用操作符
*,而指针需要使用*来访问指向的值。 - 引用必须要初始化,而指针可以不初始化(但大多数情况下不推荐)。
因为这些原因,引用在很多场景下比指针更安全、更简洁。因此,在 C++ 中,推荐优先使用引用而不是指针,除非确实需要再部分情况下拥有指针的灵活性(此时也推荐使用智能指针)。
引用的常见用途
作为函数参数
在函数参数中使用引用,可以让函数直接操作原变量,而不是拷贝一份副本。当数据为大型结构体时,这样可以提高效率,减少资源的不必要浪费,同时也可以让函数修改外部变量的值。
#include <iostream>
using namespace std;
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 1, y = 2;
swap(x, y); // x 和 y 的值被交换
cout << x << " " << y << endl; // 输出 2 1
return 0;
}范围 for 循环
在 C++11 的范围 for 循环中,引用可以避免拷贝,提高效率,或者直接修改元素。
int arr[5] = {1, 2, 3, 4, 5};
for (int& x : arr) {
x += 10;
}注意
千万不要返回函数内部函数的引用,这样会导致悬空引用,因为函数结束后,局部变量的内存空间会被释放,引用将指向无效的内存。推荐返回确保生命周期大于函数生命周期的数据的引用。