非静态成员函数能直接访问成员变量是因为编译器隐式传入this指针,等价于this->value=10;静态成员函数无this,不可访问非静态成员;同名时须显式写this->;const成员函数中this为const Class* const,禁止修改成员。

成员函数里为什么能直接访问成员变量
因为每个非静态成员函数调用时,编译器会悄悄把当前对象的地址作为隐式参数传入,这个地址就存放在 this 指针里。你写 value = 10,实际等价于 this->value = 10 —— 编译器自动补了 this->。
注意:只有非静态成员函数才有 this;静态成员函数没有 this,因为它不绑定到具体对象,自然无法访问非静态成员。
什么时候必须显式写 this->
当形参名或局部变量名与成员变量同名时,编译器默认优先匹配局部作用域,此时必须用 this-> 明确指定成员:
class Counter {
int count;
public:
void set(int count) {
this->count = count; // 否则赋值的是参数自己
}
};其他常见场景:
立即学习“C++免费学习笔记(深入)”;
- 在返回当前对象引用时:
return *this; - 在构造函数初始化列表之后做链式调用(如流式接口)
- 将当前对象地址传给外部函数或容器时:
register_handler(this);
this 指针的类型和 const 限定
this 的类型不是简单的 Class*,而是取决于成员函数是否为 const:
- 普通成员函数中:
this类型是Class* const(指针本身不可改,但可修改所指对象) -
const成员函数中:this类型是const Class* const(既不能改指针,也不能通过它改成员)
所以如果你在 const 函数里写了 this->value = 5;,编译器会报错:assignment of member 'value' in read-only object。
容易踩的坑:返回局部对象的 this 或解引用空 this
以下写法极危险,但编译可能通过:
class Bad {
int x;
public:
Bad* get_ptr() {
return this; // 如果在临时对象上调用,返回后 this 就悬空了
}
};更隐蔽的是在构造函数里把 this 保存到全局或异步任务中——此时对象尚未构造完成,成员可能未初始化。
另外,this 永远不为 nullptr(除非你手动调用 objptr->func() 而 objptr 是空指针,这时行为未定义)。别在成员函数开头写 if (!this) return; —— 它没意义,也拦不住崩溃。
真正要检查的,是那些你主动传入、可能为空的指针参数,而不是 this。











