# 引用概念

URL: https://caijiao.org/cpp/function/references
Source: docs/cpp/function/references.md
Description: 本节将介绍 C++ 中的引用概念，学习如何使用引用来实现对变量的间接访问，以及如何利用引用优化代码。

在 C++ 中，**引用** 是一种与指针类似的概念，它允许通过另一种方式来访问变量。引用提供了一种便捷的方式来间接操作数据，而无需使用指针。引用必须在声明时进行初始化，并且一旦绑定到某个变量，就不能再改变引用的目标。

## 引用的基本用法

引用是某个变量的别名。通过引用访问变量时，修改引用会直接影响到原始变量。引用的声明方式为：

```cpp
type& reference_name = variable_name;
````

### 示例：使用引用访问变量

```cpp
#include <iostream>
using namespace std;

int main() {
    int a = 10;
    int& ref = a;  // ref 是 a 的引用

    cout << "a 的值: " << a << endl;  // 输出 a 的值
    ref = 20;  // 修改引用的值，也会修改 a 的值
    cout << "修改后的 a 的值: " << a << endl;  // 输出修改后的 a 的值

    return 0;
}
```

### 输出：

```
a 的值: 10
修改后的 a 的值: 20
```

在上述代码中，`ref` 是 `a` 的引用。通过修改 `ref` 的值，`a` 的值也随之改变，因为 `ref` 是 `a` 的别名。

## 引用的特点

* **引用必须初始化**：引用在声明时必须绑定到一个已存在的变量。无法声明未初始化的引用。

* **引用不可更改**：一旦引用绑定到某个变量，就不能再绑定到其他变量。

* **没有空引用**：引用总是绑定到一个合法的变量，因此引用不能是空引用（与指针不同，指针可以为 `nullptr`）。

## 引用作为函数参数

引用常常用于函数参数，允许函数修改传入的参数值。这比使用指针更为简洁且易于理解，因为引用语法不像指针那样需要解引用（`*`）或检查空指针。

### 示例：通过引用传递参数

```cpp
#include <iostream>
using namespace std;

void increment(int& num) {
    num++;  // 通过引用修改传入的参数
}

int main() {
    int a = 5;
    increment(a);  // 传递 a 的引用
    cout << "a 的值: " << a << endl;  // 输出修改后的 a 的值

    return 0;
}
```

### 输出：

```
a 的值: 6
```

在这个例子中，函数 `increment` 通过引用接收参数 `num`，修改了传入参数的值。由于是引用传递，`a` 的值在函数执行后发生了变化。

## 常量引用

常量引用是指引用所绑定的变量不可修改。常量引用用于避免拷贝大对象的同时，确保对象不会被修改。

### 示例：常量引用

```cpp
#include <iostream>
using namespace std;

void printValue(const int& num) {
    cout << "传入值: " << num << endl;  // 不可修改 num
}

int main() {
    int a = 10;
    printValue(a);  // 传入 a 的常量引用

    return 0;
}
```

### 输出：

```
传入值: 10
```

在上述代码中，`num` 是 `a` 的常量引用，因此在函数 `printValue` 中，无法修改 `num` 的值。

## 引用与指针的比较

* **指针可以为空**：指针可以指向 `nullptr`，而引用始终绑定到一个合法对象。
* **引用更安全**：引用在初始化时必须绑定到一个有效变量，因此不会出现空引用的问题。
* **语法简洁**：引用使用起来比指针更加简洁，代码更易于理解和维护。

## 小结

* 引用是变量的别名，用于间接访问和修改变量。
* 引用一旦绑定到变量，就不能再更改绑定的目标。
* 通过引用传递参数可以提高函数效率并避免不必要的拷贝。
* 常量引用确保了传入参数不可修改，适用于传递大对象时避免拷贝。

理解引用的使用能够提高代码的清晰度和性能，并帮助你写出更高效的 C++ 代码。
