一、this 指针的核心定义
this指针是非静态成员函数中一个隐式的、常量指针(类名* const this),由编译器自动添加到函数的参数列表中,指向当前调用该成员函数的对象。
简单说:
this指针存在于非静态成员函数的作用域内,静态成员函数没有this指针;
this指针的值 = 当前对象的内存地址;
你无需手动定义this指针,编译器会自动处理,但可以在成员函数中显式使用。
二、底层原理:编译器如何处理 this 指针
- 隐式参数的本质
你写的代码:
cpp
class Person {
private:
int age;
public:
void setAge(int a) {
age = a; // 等价于 this->age = a
}
};
Person p;
p.setAge(20);
编译器实际编译后的逻辑(伪代码):
cpp
// 成员函数被编译为全局函数,隐式添加this指针参数
void Person_setAge(Person* const this, int a) {
this->age = a; // 通过this指针访问当前对象的成员
}
// 调用成员函数时,自动传递对象地址给this指针
Person_setAge(&p, 20);
核心结论:
this是成员函数的第一个隐式参数,类型为类名* const(指针本身不可修改,指向的对象内容可修改);
调用成员函数时,编译器自动将 "当前对象的地址" 传递给this指针。
- this 指针的存储位置
this指针通常存储在栈区(作为函数参数),或由编译器优化到寄存器中(提升访问效率),不属于对象的内存空间(sizeof(对象)不会包含this指针的大小)。
三、this 指针的显式使用场景
虽然编译器会自动处理this,但以下场景需要显式使用:
- 区分成员变量和函数参数(命名冲突)
当成员变量和函数参数同名时,必须用this->指定成员变量:
cpp
class Person {
private:
int age;
public:
// 参数名和成员变量名相同,用this区分
void setAge(int age) {
this->age = age; // this->age 是成员变量,age是参数
}
int getAge() {
return this->age; // 也可省略this,编译器自动识别
}
};
- 从成员函数中返回当前对象(链式调用)
常用于重载赋值运算符、流操作符等场景,实现链式调用:
cpp
class Person {
private:
int age;
public:
Person& setAge(int age) {
this->age = age;
return *this; // 返回当前对象的引用(*this是对象本身)
}
Person& setName(string name) {
// ...
return *this;
}
};
// 链式调用:连续调用多个成员函数
Person p;
p.setAge(20).setName("张三");
关键:返回*this(对象本身)而非this(指针),才能支持.调用;若返回this,则需要用->调用。
- 在成员函数中访问当前对象的地址
cpp
class Test {
public:
void showAddr() {
cout << "当前对象的地址:" << this << endl;
}
};
int main() {
Test t1, t2;
t1.showAddr(); // 输出t1的地址
t2.showAddr(); // 输出t2的地址
return 0;
}
四、this 指针的核心特性

扩展:const 成员函数中的 this 指针
当成员函数被const修饰时,this指针的类型变为const 类名* const this,无法修改成员变量:
cpp
class Person {
private:
int age;
public:
// const成员函数:this指针指向的对象不可修改
void showAge() const {
// this->age = 30; // 编译错误:const成员函数不能修改成员变量
cout << this->age << endl; // 只读访问允许
}
};
五、常见误区与坑点
- 误区 1:this 指针属于对象的内存
→ 错误!this是成员函数的参数,存储在栈 / 寄存器,对象的内存仅包含非静态成员变量,不包含this。 - 误区 2:静态成员函数可以使用 this
→ 错误!静态成员函数属于类,不绑定具体对象,编译器不会为其添加this参数,因此无法使用this,也无法访问非静态成员。 - 坑点:空指针调用成员函数
cpp
class Test {
public:
void func1() { // 无成员变量访问
cout << "func1调用成功" << endl;
}
void func2() { // 访问成员变量
cout << "age = " << this->age << endl;
}
private:
int age;
};
int main() {
Test* p = nullptr; // 空指针
p->func1(); // 能运行!因为func1不访问成员变量,仅调用代码段的函数
p->func2(); // 崩溃!因为this是nullptr,解引用访问age会触发段错误
return 0;
}
原因:成员函数存在代码段,空指针调用时只要不通过this访问成员变量,就不会崩溃;一旦访问成员变量(this->xxx),就会解引用空指针,导致程序崩溃。
总结
核心本质:this是编译器为非静态成员函数添加的隐式常量指针,指向当前调用函数的对象,存储在栈 / 寄存器中,不属于对象内存;
关键用途:区分同名的成员变量和参数、实现链式调用、显式访问当前对象;
核心限制:仅在非静态成员函数中可用,const 成员函数中this指向的对象不可修改;
常见坑点:空指针调用成员函数时,无成员变量访问的函数可运行,访问成员变量则崩溃。