17370845950

C++ 成员函数const修饰谁 C++ this指针的const属性解析【语法】
const成员函数将this指针类型变为const T*,禁止修改非mutable成员,但允许修改mutable成员、间接修改外部对象及操作局部变量;const与non-const版本可重载,依据调用对象是否const选择。

const 成员函数修饰的是 this 指针所指向的对象

写成 void func() const,不是说 func 本身不可变,而是编译器会把隐式参数 this 的类型从 T* 变成 const T*。这意味着在该函数体内,你不能通过 this(即不能通过 this-> 或直接访问成员)修改当前对象的任何非 mutable 成员。

const 成员函数里能改哪些东西

看似“只读”,但有例外。以下操作是允许的:

  • mutable 修饰的成员变量可以被修改(常用于缓存、计数器等逻辑上不改变对象“状态”的字段)
  • 通过指针或引用间接修改外部对象(比如成员是指针,你改它指向的内容)
  • 调用其他 const 成员函数
  • 局部变量、形参、静态变量照常可写

但以下操作会编译报错:

  • 给普通成员变量赋值(如 value = 42;
  • 调用非 const 成员函数(如 do_something();,除非该函数也声明为 const
  • 返回非 const 引用或指针指向当前对象的成员(除非显式 const_cast,但通常不推荐)

const 和 non-const 成员函数的重载关系

它们可以构成重载——编译器根据调用对象是否为 const 来选择版本:

class Example {
public:
    int& get() { return data; }           // 非 const 版本
    const int& get() const { return data; } // const 版本
private:
    int data = 0;
};

使用时:

  • Example e; e.get() = 10; → 调用非 const 版本
  • const Example ce; ce.get(); → 只能调用 const 版本,返回 const int&,不能赋值

注意:仅靠返回值不同无法重载,必须一个带 const、一个不带,且 this 的 cv-qualifier 不同才是合法重载。

容易忽略的细节:const 成员函数里 this 的真实类型

void foo() const 中,this 的类型是 const T* const(顶层 const 表示指针本身不可变,底层 const 表示它指向的对象不可变)。也就是说:

  • 你不能写 this = nullptr;(顶层 const 禁止重绑定 this
  • 也不能写 this->x = 1;(底层 const 禁止修改成员)
  • 但你可以安全地取地址、做 static_cast(this)、传给只读接口

很多调试时发现“明明加了 const 还能改”,往往是因为改的是指针所指内

容,或误用了 mutable,而不是 this 本身的 const 属性失效了。