在C++的面向对象编程中,this指针是类成员函数中隐含的一个指针,它的指向和当前调用成员函数的对象直接相关,是连接成员函数和所属对象的重要桥梁。

this指针的基本指向规则
当我们在类中定义成员函数时,编译器会隐式地为每个非静态成员函数添加一个this指针参数,这个this指针指向调用该成员函数的对象本身。也就是说,哪个对象调用了成员函数,this指针就指向那个对象的首地址。
需要注意的是,this指针只存在于类的非静态成员函数中,静态成员函数不属于任何对象,因此没有this指针。另外,this指针本身是一个右值,我们不能获取this指针的地址,也不能对它进行赋值操作。
代码示例演示this指针指向
下面通过一个简单的Person类来演示this指针的指向:
#include <iostream>
#include <string>
class Person {
private:
std::string name;
int age;
public:
// 构造函数,初始化成员变量
Person(std::string n, int a) {
// 这里的this->name指向当前对象的name成员,n是构造函数的参数
this->name = n;
this->age = a;
std::cout << "构造函数中this指针指向的对象地址: " << this << std::endl;
}
// 成员函数,打印对象信息
void printInfo() {
std::cout << "姓名: " << this->name << ", 年龄: " << this->age << std::endl;
std::cout << "printInfo中this指针指向的对象地址: " << this << std::endl;
}
// 返回当前对象的地址
Person* getThis() {
return this;
}
};
int main() {
Person p1("张三", 20);
Person p2("李四", 25);
std::cout << "p1对象的地址: " << &p1 << std::endl;
std::cout << "p2对象的地址: " << &p2 << std::endl;
std::cout << "调用p1的printInfo:" << std::endl;
p1.printInfo();
std::cout << "调用p2的printInfo:" << std::endl;
p2.printInfo();
// 验证getThis返回的地址和对象地址是否一致
std::cout << "p1.getThis()返回的地址: " << p1.getThis() << std::endl;
std::cout << "p2.getThis()返回的地址: " << p2.getThis() << std::endl;
return 0;
}
运行上述代码后可以发现,当p1调用成员函数时,函数内的this指针地址和p1的对象地址完全一致;p2调用成员函数时,this指针地址和p2的对象地址完全一致,这直接证明了this指针指向调用成员函数的当前对象。
this指针的常见使用场景
- 当成员函数的参数名和类的成员变量名相同时,用this指针区分成员变量和参数,比如构造函数中常见的
this->name = name写法。 - 在成员函数中返回当前对象的引用或指针,支持链式调用,比如很多类的赋值运算符重载会返回
*this。 - 判断两个对象是否是同一个对象,比如可以在成员函数中比较
this和另一个对象的地址是否相同。
注意事项
不要在类的静态成员函数中使用this指针,因为静态成员函数不依赖于具体对象,编译阶段就会报错。另外,如果成员函数被声明为const成员函数,那么this指针的类型是const 类名* const,不能通过this指针修改对象的成员变量。