这个问题非常关键,因为很多人看到函数里加了 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 成员函数的区别?