this 是编译器隐式传入的 t 类型指针,指向当前对象实例;不可在 static 函数中使用,构造函数初始化列表中不可访问未初始化成员,可能为 nullptr;用于自赋值检查、链式调用返回 this、lambda 捕获时需警惕生命周期。

为什么 this 指针不是对象本身,而是一个指针?
因为 this 是编译器自动传入成员函数的隐式参数,类型是 T*(比如 MyClass*),指向当前正在调用该函数的那个对象实例。它不是对象副本,也不是引用(除非你显式写成 const T&),更不是全局变量——它只在非静态成员函数内部有效。
常见错误现象:error: 'this' is unavailable in static member function。静态函数没对象上下文,自然没有 this。
- 不能在
static成员函数里用this - 不能在构造函数初始化列表里用
this->xxx访问未初始化的成员(此时对象还没建完) -
this值可能为nullptr(比如通过空指针调用非虚成员函数),但一解引用就 UB,别依赖它“安全”
怎么用 this 解决赋值运算符中的自赋值问题?
自赋值(a = a;)看似无害,但在涉及深拷贝、资源释放的 operator= 里极易出错:先 delete 再访问已释放内存,程序崩溃。
典型做法是开头加判断:if (this == &other) return *this;。这里 &other 是参数引用取地址,this 是当前对象地址,两者相等即自赋值。
立即学习“C++免费学习笔记(深入)”;
- 必须用
==比较地址,不能用==比内容(内容比较慢,且不一定定义了) - 这个检查要放在所有资源清理操作之前,否则没意义
- 如果类有继承关系,且
operator=是虚的,仍需确保基类部分也处理自赋值
this 在返回 *this 和链式调用里的实际作用
想让 obj.setA(1).setB(2).print(); 这种链式调用工作,每个 setter 必须返回对象自身引用,而 *this 就是那个引用。
示例:MyClass& setA(int a) { this->a = a; return *this; }。注意返回类型是 MyClass&,不是 void 或 MyClass(后者会触发拷贝,低效且无法链式)。
- 返回
*this时,确保函数不是const的(否则*this是const MyClass&,类型不匹配) - 如果函数声明为
const,就不能返回非 const 引用,链式调用自然失效 - 移动语义下,有时需要重载右值版本(
MyClass&& setX(...) &&),这时this指向的是即将被移走的对象,行为要谨慎
为什么在 lambda 捕获 this 时要特别小心生命周期?
在类成员函数中写 [this]() { ... },lambda 持有的是当前对象的原始指针。如果 lambda 被保存下来(比如传给异步任务、信号槽、std::function),而对象在此之前已被销毁,再执行 lambda 就是野指针访问。
常见错误现象:程序偶发崩溃,堆栈显示在 lambda 体内访问了 this->xxx,但对象早已析构。
- 避免裸捕获
this,改用[self = shared_from_this()]() mutable { ... }(需继承std::enable_shared_from_this) - 如果不用智能指针,至少得确保 lambda 的生存期严格短于对象本身(比如只在函数内同步调用)
- Clang/GCC 的
-Wlifetime(或-Wdangling-gsl)能帮捕获部分问题,但不覆盖所有场景
真正麻烦的从来不是语法怎么写,而是谁拥有对象、谁决定它什么时候死——this 不管这些,它只负责指过去。










