this 是 C++ 为非静态成员函数自动插入的隐式参数,类型为 ClassName*,指向当前对象首地址,不占用对象内存,仅在调用时临时存在;它不是对象本身,不能在静态函数、全局函数、类定义体外或模板类型推导中使用,且可能为空指针,需谨慎避免解引用。
this 指针this 是 C++ 编译器为**非静态成员函数**自动插入的隐式参数,类型为 ClassName*(指向当前对象的指针)。它不是变量声明,也不占用类对象的内存空间,只在成员函数调用时临时存在。
常见误解是认为 this 是“对象本身”——其实它只是指向对象首地址的指针。比如 obj.func() 调用中,编译器实际传入的是 &obj 作为 this 的值。
this 在成员函数中的行为细节所有非静态成员函数(包括构造函数、析构函数、运算符重载)都隐含接收一个 this 参数,但你不能在函数声明里显式写出它,也不能在调用时手动传参。
this 类型是 const ClassName*,因此不能通过 this 修改成员变量(除非该成员被声明为 mutable)*this 常用于实现链式调用(如 obj.setA(1).setB(2)),此时必须返回引用(ClassName&)而非值或指针,否则会返回临时对象this->member,因为此时对象尚未完全构造;但可以在构造函数体内部安全使用this
this 只在**非静态成员函数体内**合法。以下场景直接报错:
this → 编译错误:error: 'this' is not available in static member functions
this → 编译器根本不知道它指谁this->x → 语法错误,this 不是作用域内可见标识符decltype 中误以为 this 是类型 → 它是表达式,不是类型名;需用 decltype(*this) 或 std::remove_reference_t 获取类型this 和生命周期、空指针this 本质上是个普通指针,所以它可能为空(null)——只要调用者传了空地址,而编译器不阻止这种调用(尤其在未启用 -fsanitize=undefined 时)。
void log() { cout ),可能“侥幸”运行成功,但这属于未定义行为
this->x 或 sizeof(*this) 等解引用操作,空 this 必然崩溃this 时(如 [this]{ ... }),捕获的是当前对象地址,若 lambda 生命周期长于对象本身,后续调用将悬空真正安全的做法不是依赖 this 是否为空,而是确保调用方不传空指针——C++ 不提供运行时 this 非空保证,这点和 Java/C# 的 this 有本质区别。