因为编译器自动将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更重要。









