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 反馈 — 无需本地设置。
此课程中的所有课时
- 引用为何是变量的别名
- 按值传递与按引用传递
- const 引用及其适用场景
- 引用的生命周期与悬空引用