文章

引用的使用场景

引用用于函数参数传递、返回值优化和避免拷贝,支持别名和链式调用,简化代码效率高。

引用的使用场景

引用的使用场景

1. 函数参数传递(避免拷贝,提高效率)

当函数参数是一个大型对象(如结构体、vector、string),如果传值会产生拷贝,浪费性能:

1
2
3
void modify(string &s) {  // 用引用传递,避免拷贝
    s += " modified";
}

如果用:

1
void modify(string s) { ... }  // 会拷贝一份 s,效率差

2. 返回引用(返回原对象,支持链式调用)

1
2
3
4
5
int& getElement(int arr[], int index) {
    return arr[index];  // 返回引用,允许修改原数组
}

getElement(arr, 2) = 100;  // 直接修改 arr[2]

3. 作为函数返回值的左值(链式调用)

例如实现链式调用或容器封装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>

using namespace std;

class Counter {
    int value;
public:
    Counter &increment() {
        ++value;
        return *this;
    }

    void print() const {
        cout << value << endl;
    }
};

int main() {
    Counter c;
    c.increment().increment().print();  // 输出 2
}

4. 范围 for 循环中避免拷贝

1
2
3
4
5
vector<int> nums = {1, 2, 3};

for (int &x: nums) {  // 引用,直接修改原数组
    x *= 2;
}

如果用 int x 会复制一份,无法修改原始内容。

5. 引用别名(简化复杂表达式)

1
2
3
4
5
6
7
int main() {
    int a = 5;
    int &b = a;  // b 是 a 的别名,修改 b 就是修改 a

    b = 10;
    cout << a;  // 输出 10
}

总结

场景用法优点
大对象参数传递const Type &param避免拷贝
修改外部值void f(Type &param)能修改实参
返回引用Type& f()直接操作原始对象
循环遍历for (Type &x : container)原地修改容器元素
别名简化Type &alias = variable语义清晰
本文由作者按照 CC BY 4.0 进行授权