前言

这一节内容可能会涉及到一些之前所学习的相关知识,如果你还有不明白的,可以去温习一下之前所学C++基础教程

C++引用

什么是引用?

在 C++ 中,引用 就是变量的另一个名字(别名)。
可以把它理解成一个“昵称”:通过这个昵称,和直接用变量名字效果是一样的,操作的都是同一个数据。
一旦给变量起了这个“昵称”,就不能再改了,引用会一直绑定在这个变量上。


引用与指针的区别

虽然引用和指针都能用来间接访问变量的内容,但它们有以下重要区别:

  1. 引用必须合法

    • 引用在创建时,必须绑定到一个有效的变量。
    • 指针可以为空(指向 NULL),或者在以后指向其他变量。
  2. 绑定不可更改

    • 引用一旦和某个变量绑定,就不能改为绑定其他变量。
    • 指针可以随时指向其他变量。
  3. 必须初始化

    • 引用在创建时,必须立刻绑定到某个变量。
    • 指针可以在创建时不赋值,稍后再初始化。

如何创建引用?

想象变量是贴在内存位置上的标签,引用就是这个标签的第二个名字。
用法很简单,直接用符号 & 创建一个引用。例如:

1
2
int i = 17;  // 定义一个变量 i
int& r = i; // 给 i 起了一个别名 r

这里:

  • r 是变量 i 的引用。
  • 无论是用 i 还是用 r,操作的都是同一个数据。

一个完整例子

来看下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;

int main() {
// 声明简单变量
int i; // 一个整型变量
double d; // 一个 double 型变量

// 声明引用变量
int& r = i; // r 是 i 的引用
double& s = d; // s 是 d 的引用

// 给 i 和 d 赋值
i = 5;
d = 11.7;

// 通过变量名和引用名访问值
cout << "Value of i: " << i << endl; // 直接用 i
cout << "Value of i reference: " << r << endl; // 用引用 r
cout << "Value of d: " << d << endl; // 直接用 d
cout << "Value of d reference: " << s << endl; // 用引用 s

return 0;
}

运行结果:

1
2
3
4
Value of i: 5
Value of i reference: 5
Value of d: 11.7
Value of d reference: 11.7

解释

  • int& r = i;

    • 这里 r 是变量 i 的别名。之后,无论是通过 r 还是通过 i 修改值,结果都是一样的,因为它们指向同一块内存。
  • double& s = d;

    • 这里 s 是变量 d 的别名,类似上面。

总结:引用就是变量的另一个名字,引用名和变量名操作的是同一个值。


引用的两个重要用法

  1. 引用作为函数参数

    • 在函数参数中使用引用,可以让函数直接操作传入的变量,而不是创建一个副本。
    • 这种方法既高效,又可以避免不必要的数据拷贝。

    例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void swap(int& x, int& y) {
    int temp = x;
    x = y;
    y = temp;
    }

    int main() {
    int a = 5, b = 10;
    swap(a, b); // 交换 a 和 b 的值
    cout << "a: " << a << ", b: " << b << endl; // 输出 a: 10, b: 5
    return 0;
    }

    解释

    • swap 函数的参数是引用,因此可以直接修改 ab 的值,而不需要返回值。
  2. 引用作为函数返回值

    • 可以从函数中返回一个引用,这样可以直接操作返回的值,而不需要拷贝。

    例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int& getReference(int arr[], int index) {
    return arr[index]; // 返回数组元素的引用
    }

    int main() {
    int numbers[3] = {10, 20, 30};
    getReference(numbers, 1) = 50; // 修改数组的第二个元素
    cout << numbers[1] << endl; // 输出 50
    return 0;
    }

    解释

    • getReference 返回的是数组元素的引用,因此可以直接修改数组内容,而不需要拷贝数据。

小总结

  1. 什么是引用?
    引用是变量的另一个名字(昵称),操作引用就等于操作变量本身。

  2. 引用有什么用?

    • 减少不必要的数据拷贝,提高效率。
    • 让代码更简洁,比如用在函数参数或返回值中。
  3. 引用和指针的区别?

    • 引用更安全,因为它不能是空引用,且绑定后不能改变。
    • 指针更灵活,因为它可以为空,也可以随时指向其他变量。