这个问题非常关键,因为很多人看到函数里加了 const 会疑惑它到底控制的是什么。其实要分清三个层面:
1. 参数加 const
(1) 值传递参数
void foo(const int x) {
// x 在函数体内不能被修改
}
这里 x 是按值传递的,本来就是函数里的局部拷贝,加 const 只是防止你在函数体里修改这个副本。对调用者没有任何影响。
👉 常见于避免误操作,但没性能意义。
(2) 指针参数
void bar(const int* p) {
*p = 5; // ❌ 错误
}
表示 p 指向的值不能改,但指针本身可以改。
常见于函数“只读访问”外部数据。
(3) 引用参数
void baz(const std::string& s) {
// 只能读 s,不能修改
}
这是最常用的写法,避免拷贝,又防止修改。
👉 用在传递大对象(std::string, vector 等)时非常高效。
2. 返回值加 const
const int getX();
返回值是按值返回的,加 const 没什么意义(返回的临时量本来就不能改)。
但对返回引用或指针时有用:
const int& getValue() { return data; }
表示调用者不能通过返回值修改内部数据,保护封装。
3. 成员函数加 const
这是 C++ 里最重要的 const 用法:
class A {
public:
int get() const { return x; }
private:
int x;
};
含义:
- 表示这个成员函数不会修改对象的成员变量(除了
mutable成员)。 - 只能调用其他
const成员函数。 - 允许在
const对象上调用:
const A a;
a.get(); // ✅ 可以
👉 如果不加 const,就不能在 const 对象上调用成员函数,会严重影响类的可用性。
✅ 总结表
| 位置 | 示例 | 影响 |
|---|---|---|
| 参数-值 | void f(const int x) |
防止在函数体内修改参数副本 |
| 参数-指针 | void f(const int* p) |
指针指向内容不能改 |
| 参数-引用 | void f(const T& x) |
常用,避免拷贝 + 保证只读 |
| 返回值 | const int& f() |
保护内部数据,不允许外部通过返回值修改 |
| 成员函数 | int f() const |
保证不改对象,能在 const 对象上调用 |
要不要我帮你写一个小 demo 程序,展示同一个类里 const 成员函数和非 const 成员函数的区别?
浙公网安备 33010602011771号