this指向调用该函数的对象的首地址,即obj在内存中的起始位置;其类型随成员函数限定符变化,是纯右值,不可取地址或赋值,仅在名字查找歧义或依赖名称时需显式使用this->。

成员函数里 this 指向谁?
指向调用该函数的那个对象的首地址,不是类定义的位置,也不是栈上随便一个地址——就是 obj.func() 里的 obj 在内存里的起始位置。
注意:哪怕函数是 const 或 noexcept 修饰的,this 类型也会跟着变:const MyClass* 或 MyClass* noexcept 的 this 类型会不同,但值仍是对象地址。
-
this是隐式参数,不占函数签名,所以重载不能靠this的 const 性区分(得靠成员函数自身的const限定符) - 静态成员函数没有
this,写this->xxx直接编译报错:error: 'this' is unavailable for static member functions - 在构造函数体中,
this已有效,但此时对象尚未完全构造完毕;访问虚函数或未初始化成员可能引发未定义行为
为什么 this 不能被取地址或赋值?
因为 this 是右值(C++11 起明确为纯右值),本质是临时生成的指针常量,类似字面量 nullptr,不是变量。
- 写
&this→ 编译错误:error: address of rvalue - 写
this = nullptr→ 编译错误:error: expression is not assignable - 但可以把它赋给另一个指针变量:
MyClass* p = this;,这是合法的,因为发生了隐式转换
什么时候必须显式用 this->?
主要出现在名字查找歧义时:当形参/局部变量和成员变量同名,又没加 this->,编译器默认用局部名。
立即学习“C++免费学习笔记(深入)”;
void set_name(const std::string& name) {
name = name; // ❌ 赋值给自己,成员 name 没变
this->name = name; // ✅ 正确:this->name 是成员,右边是参数
}- 模板类中依赖名称(dependent name)有时也强制要
this->,否则编译器不认为它是成员:template<typename t> struct X { T val; void f() { auto x = this->val; } };</typename> - 在 lambda 捕获
[this]后,lambda 内部仍可用this->xxx访问外部对象成员,但要注意对象生命周期是否还有效
this 和对象布局、继承的关系
多重继承下,this 的值不一定是对象内存起始地址——它可能指向某个基类子对象的起始处,取决于调用的是哪个基类的成员函数。
- 比如
class D : public A, public B,在B的成员函数里,this指向的是B子对象的地址,不一定等于static_cast<void>(d_ptr)</void> - 这种偏移由编译器在调用时自动调整,你写的
this->x会被转成带 offset 的内存访问 - 因此,把
this强转成void*再传给 C 接口时要格外小心,尤其涉及多继承或虚继承的类
成员函数里 this 的值看似简单,但一旦牵扯到继承链、模板推导、生命周期管理,就很容易掉进“以为它是指向整个对象开头”的陷阱。最稳妥的做法是:别假设 this 等于对象地址,需要确切地址时,用 static_cast<char>(this)</char> 显式转成字节指针再算偏移。










