

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