this 是 C++ 为非静态成员函数自动插入的隐式参数,类型为 ClassName*,指向当前对象首地址,不占用对象内存,仅在调用时临时存在;它不是对象本身,不能在静态函数、全局函数、类定义体外或模板类型推导中使用,且可能为空指针,需谨慎避免解引用。

什么是 this 指针
this 是 C++ 编译器为**非静态成员函数**自动插入的隐式参数,类型为 ClassName*(指向当前对象的指针)。它不是变量声明,也不占用类对象的内存空间,只在成员函数调用时临时存在。
常见误解是认为 this 是“对象本身”——其实它只是指向对象首地址的指针。比如 obj.func() 调用中,编译器实际传入的是 &obj 作为 this 的值。
this 在成员函数中的行为细节
所有非静态成员函数(包括构造函数、析构函数、运算符重载)都隐含接收一个 this 参数,但你不能在函数声明里显式写出它,也不能在调用时手动传参。
- 在 const 成员函数中,
this类型是const ClassName*,因此不能通过this修改成员变量(除非该成员被声明为mutable) - 返回
*this常用于实现链式调用(如obj.setA(1).setB(2)),此时必须返回引用(ClassName&)而非值或指针,否则会返回临时对象 - 在构造函数初始化列表中不能使用
this->member,因为此时对象尚未完全构造;但可以在构造函数体内部安全使用
哪些地方不能用 this
this 只在**非静态成员函数体内**合法。以下场景直接报错:
立即学习“C++免费学习笔记(深入)”;
- 静态成员函数中访问
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必然崩溃 - 在 lambda 捕获
this时(如[this]{ ... }),捕获的是当前对象地址,若 lambda 生命周期长于对象本身,后续调用将悬空
真正安全的做法不是依赖 this 是否为空,而是确保调用方不传空指针——C++ 不提供运行时 this 非空保证,这点和 Java/C# 的 this 有本质区别。










