this是一个隐式传入的classname const指针,指向当前对象;不是关键字、对象本身或引用;空指针调用时为nullptr;静态函数无this;const成员函数中为const classname const;常用于解决名字遮蔽和模板依赖查找。

成员函数里 this 是什么,不是什么
this 是一个隐式传入的、类型为 ClassName* 的常量指针(即 ClassName* const this),指向当前正在调用该成员函数的对象实例。它不是关键字,也不是对象本身,更不是引用——它就是一个普通指针,只是编译器自动加在非静态成员函数参数列表最左边(你写函数时看不见,但底层存在)。
常见误解:以为 this == &obj 总是成立 → 实际上仅当函数被合法对象调用时才成立;如果通过空指针调用(如 ((MyClass*)nullptr)->func()),this 就是 nullptr,此时访问成员变量或调用虚函数会直接崩溃。
- 静态成员函数没有
this,因为不绑定具体对象 -
const成员函数中,this类型是const ClassName* const,意味着不能通过它修改对象状态 - 返回
*this常用于实现链式调用(如obj.setA(1).setB(2)),但要注意返回的是对象副本还是引用
什么时候必须显式用 this->
主要出现在名字遮蔽(name hiding)场景:当形参或局部变量和成员变量同名时,编译器默认优先匹配局部名,这时要用 this-> 明确指定成员。
class Widget {
int value;
public:
void set(int value) {
this->value = value; // 必须写 this->,否则赋值的是形参自己
}
};另一个典型场景是模板类中依赖于 this 的名称查找(ADL 或从基类继承的成员):
立即学习“C++免费学习笔记(深入)”;
- 在派生类模板中调用基类的模板成员函数,有时需写
this->func()让编译器延迟解析 - 否则可能报错 “‘func’ was not declared in this scope”,尤其在 GCC 下较严格
把 this 传给其他函数容易踩的坑
把 this 指针保存到异步回调、线程、lambda 或容器中,是最常见的悬垂指针来源之一。
- 对象生命周期结束早于接收方使用该指针 → 解引用
this导致未定义行为 - lambda 捕获
this是按值捕获指针,不会延长对象生命;若捕获*this(C++17 起),才是复制整个对象 - 多线程环境下,若无同步机制,
this所指对象可能正被析构,而另一线程还在调用其成员函数
规避方式:用 std::shared_ptr 管理对象生命周期,配合 weak_ptr 检查有效性;或确保调用方与对象生命周期严格对齐(如只在栈对象作用域内短时传递)。
this 和虚函数调用的关系
虚函数调用依赖 this 所指对象的实际类型(运行时类型),而非静态类型。也就是说,哪怕你用基类指针调用,只要 this 指向的是派生类对象,就会走派生类的虚函数实现。
但注意:构造/析构期间,this 的动态类型是“当前正在构造或析构的那个类”,虚函数表尚未完全就绪或已被清空。因此:
- 构造函数中调用虚函数,不会发生多态,只调用当前类的版本(甚至可能纯虚函数未定义导致链接失败)
- 析构函数中同理,且一旦基类析构完成,再通过
this访问派生类成员就是未定义行为
这和 this 指针本身无关,而是虚机制在对象生命周期特定阶段的限制——但它常常被误认为是 this 的问题。
真正难察觉的是:某些调试器在断点处显示的 this 地址看似正常,但对象可能已处于析构中途,此时任何成员访问都危险。











