必须显式使用 this-> 是为区分同名形参与成员变量、解决模板二阶段查找、保证 const 成员函数安全性及避免生命周期错误;否则易导致自赋值、编译失败或悬空指针。

为什么在成员函数里用 this 而不是直接写变量名?
因为当形参名和成员变量同名时,编译器默认绑定到形参——this 是唯一能明确指向当前对象成员的途径。比如 void set_x(int x) { this->x = x; },不加 this-> 就是自赋值,没效果。
常见错误现象:x = x; 看似合理,实际是形参给自己赋值;调试时发现成员变量始终没变,就是这个原因。
-
this是隐式传入的 const 指针(类型如MyClass* const),不能被赋值或取地址(&this非法) - 只在非静态成员函数中可用;静态函数里用
this会编译报错:error: 'this' is not available in static member functions - 返回
*this是实现链式调用的基础,比如obj.set_x(1).set_y(2)
this 在 const 成员函数里的类型变化
const 成员函数中,this 的类型自动变为 const MyClass* const,意味着你不能通过它修改成员变量,也不能调用非 const 成员函数。
典型报错:error: assignment of member 'x' in read-only object,出现在 const 函数里写了 this->x = 5;。
- 如果函数声明带
const(如int get_x() const),this就是 const 指针,只能访问 const 成员或调用 const 成员函数 - 想在 const 函数里修改某个成员,得用
mutable修饰它,否则编译不过 - 不要试图强制转换
const_cast<myclass>(this)</myclass>去绕过限制——这破坏 const 正确性,多数情况说明设计有问题
什么时候必须显式写 this->?
除了形参遮蔽成员变量外,模板类中依赖于当前类型的成员访问也常需 this->,否则编译器可能无法解析。
比如在类模板派生类里调用基类模板的成员函数:this->func() 可避免二阶段查找失败;不写容易触发 error: there are no arguments to 'func' that depend on a template parameter。
- 成员变量名被局部变量或形参遮蔽时,必须用
this->name - 在模板中调用继承来的、依赖模板参数的成员,建议统一加
this->提前绑定 - 即使没遮蔽,有些团队规范也要求一律显式写
this->,增强可读性——但注意这不是语言要求,纯属风格
误用 this 导致悬空指针的典型场景
把 this 存到容器、线程或异步回调里,但对象生命周期已结束,后续解引用就崩了。这不是 this 本身的问题,而是生命周期管理疏忽。
常见错误:在构造函数里把 this 传给另一个对象保存,结果该对象还在用时,原对象已被析构;运行时报 Segmentation fault 或 undefined behavior。
- 避免在构造函数中暴露
this(包括传给其他对象、注册回调、启动线程) - 若必须传递,改用
std::shared_ptr<t></t>管理生命周期,让接收方持有一个shared_ptr而非裸指针 - lambda 捕获
this时尤其小心:默认按值捕获的是this指针,不是对象副本;对象销毁后 lambda 再执行就会出问题
成员函数内对 this 的误判,往往不在语法层面,而在生命周期和 const 正确性上——这两处一旦出错,调试成本远高于写错一个 this->。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











