0Pricing
C++ Academy · 课时

const 引用及其适用场景

使用 const 引用高效且安全地传递大型对象

const 引用及其适用场景 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

const 引用的保证

const T& 表示:“我不会修改所引用的对象。”编译器会对此进行强制检查。

void print(const std::string& s) {
    // s.clear();   // ERROR: s is const
    std::cout << s;
}

为什么不直接按值传递

复制大型对象会造成浪费。const 引用几乎没有成本(底层实际上只是一个指针),并且绝不会让函数修改调用方的数据。

可以绑定到任何对象

const 引用可以绑定到左值、右值和临时对象,因此它是只读访问中限制最少的参数类型。

void f(const std::string& s);
std::string a = "hi";
f(a);                 // lvalue
f("hello");           // temporary string
f(std::move(a));      // rvalue

生命周期延长

将临时对象绑定到 const 引用会把临时对象的生命周期延长至引用的生命周期。这对于内联构造很有用。

const std::string& greeting = "Hello, " + name;
// the concatenated string lives as long as `greeting`

何时不使用 const 引用

对于可平凡复制的类型(int、double、pointer),请按值传递。引用会增加一次间接寻址,却没有带来任何节省。

基于范围的 for 中的 const 引用

这是只读循环的标准写法,可以同时避免复制和意外修改。

for (const auto& x : container) {
    process(x);
}

返回 const 引用

当结果是调用方不应修改的现有对象(例如成员或缓存值)时,请返回 const 引用。

class Person {
    std::string name_;
public:
    const std::string& name() const { return name_; }
};

const 正确性

将每个不会修改状态的参数和成员函数标记为 const。编译器会捕获意外写入,提供强大的安全保障。

const 成员函数

在参数列表后标记为 const 的成员函数不能修改对象。它可以在 const 实例上调用。

class Counter {
    int n_ = 0;
public:
    int value() const { return n_; }   // pure reader
    void increment() { n_++; }
};

陷阱:const_cast 移除 const

您可以使用 const_cast 移除 const,但对原本就是 const 的对象这样做会产生未定义行为。只有在与旧式非 const API 交互时才应使用它。

使用 mutable 保存内部状态

mutable 关键字允许 const 成员函数修改特定成员,适合用于缓存或互斥量。

class Cache {
    mutable std::mutex mtx_;
    mutable std::optional<int> cached_;
public:
    int value() const {
        std::lock_guard<std::mutex> lk(mtx_);
        // ...
    }
};

快速检查

对于参数,为什么通常写 const std::string& 比写 std::string 更好?

回顾

对于只读参数、取值函数的返回值和基于范围的循环,请使用 const T&。对于非平凡类型,它比按值传递更快,也比非 const 引用更安全。

常见问题解答

「const 引用及其适用场景」课时是免费的吗?

是的 — 「const 引用及其适用场景」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「const 引用及其适用场景」这节课中我会学到什么?

使用 const 引用高效且安全地传递大型对象 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「const 引用及其适用场景」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 引用为何是变量的别名
  2. 按值传递与按引用传递
  3. const 引用及其适用场景
  4. 引用的生命周期与悬空引用
← 返回 C++ Academy