C++中this指针怎么用_C++成员函数隐式形参this解析【基础】

11次阅读

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

C++ 中 this 指针怎么用_C++ 成员函数隐式形参 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 悬空

thisstd::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 更重要。

text=ZqhQzanResources