Logo成贤计协指南

引用

在 C++ 中,除了指针之外,还有一个非常重要的概念——引用(Reference)。引用是 C++ 独有的语法(C 语言没有),它可以让我们更加安全、简洁地操作变量,尤其是在函数参数传递、返回值等场景下非常常用。

什么是引用

引用可以认为是变量的一个“别名”,你可以把它理解为给变量起了一个新的名字。通过引用访问变量时,实际上就是在操作原来的变量本身。

引用的定义语法如下:

<数据类型>& <引用名> = <变量名>;

例如:

int a = 10;
int& ref = a; // ref 是 a 的引用(别名)

此时,refa 指向的是同一个内存空间,无论通过 a 还是 ref 修改值,都会影响同一个变量。

ref = 20; // 等价于 a = 20;
cout << a << endl; // 输出 20

引用与指针的区别

引用和指针虽然都可以用来间接访问变量,但它们有一些重要的区别:

  • 指针可以为 nullptr(空指针),但是引用必须绑定到一个有效的变量
  • 引用一旦绑定到一个变量,就不能再更换指向,而指针可以随时重新指向其他变量。
  • 访问引用时不需要解引用操作符 *,而指针需要使用 * 来访问指向的值。
  • 引用必须要初始化,而指针可以不初始化(但大多数情况下不推荐)。

因为这些原因,引用在很多场景下比指针更安全、更简洁。因此,在 C++ 中,推荐优先使用引用而不是指针,除非确实需要再部分情况下拥有指针的灵活性(此时也推荐使用智能指针)。

引用的常见用途

作为函数参数

在函数参数中使用引用,可以让函数直接操作原变量,而不是拷贝一份副本。当数据为大型结构体时,这样可以提高效率,减少资源的不必要浪费,同时也可以让函数修改外部变量的值。

main.cpp
#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;
}

注意

千万不要返回函数内部函数的引用,这样会导致悬空引用,因为函数结束后,局部变量的内存空间会被释放,引用将指向无效的内存。推荐返回确保生命周期大于函数生命周期的数据的引用。