因为编译器自动将 this 作为隐式第一个参数加入非静态成员函数签名,其类型为 MyClass 或 const MyClass;必须显式使用 this 的场景包括解决同名遮蔽和实现链式调用。

成员函数里 为什么 能直接用this?
因为编译器自动把 this 作为隐式第一个参数加进每个非静态成员函数签名里。你写 void set_value(int v) {val = v;},实际等价于void set_value(MyClass* this, int v) {this->val = v; }。所以this 不是关键字,而是个右值指针,类型是MyClass*(非常量成员函数)或const MyClass*(const 成员函数)。
this什么时候必须显式写出?
主要在两类场景:一是解决形参和成员变量同名的歧义;二是返回当前对象引用以支持链式调用。注意 this 本身不能被赋值或取地址(&this非法),也不能用于静态成员函数(没有隐式 this 参数)。
- 同名遮蔽时:
void set_name(const std::string& name) {this->name = name; } - 链式调用:
MyClass& add(int x) {data += x; return *this;}(返回*this,不是this) - 传给其他函数:
callback(this);(比如注册回调、放进容器)
常见误用和坑
最典型的错误是返回局部对象的 this 指针,或在构造函数体中使用 this 访问未初始化的成员。另外,this指向的是调用该成员函数的对象实例内存地址,如果对象已被析构,再解引用 this 就是未定义行为——这在回调、异步操作中尤其容易出问题。
- 构造函数里别依赖
this->member做复杂逻辑,初始化列表阶段成员还没构造完 -
return this;返回的是指针,而return *this;返回的是引用或对象副本,语义完全不同 - lambda 捕获
[this]时,要确保 lambda 生命周期不长于对象本身,否则this悬空
this和 std::shared_from_this() 的区别
this是裸指针,不管理生命周期;std::shared_from_this()要求类继承 std::enable_shared_from_this,它返回的是std::shared_ptr,能安全延长对象生存期。裸this 用错会崩溃,shared_from_this()用错会抛 std::bad_weak_ptr 异常。
立即学习“C++ 免费学习笔记(深入)”;
比如在异步回调中保存对象引用,必须用shared_from_this(),而不是存this——后者无法阻止对象提前销毁。
真正难的不是语法,是判断「此刻我需要的是地址、引用、还是带所有权的智能指针」。这个决策点,比怎么写 this 更重要。






























