c++中this指针的意义和用法

前言:在做作业的时候,看到了this指针,不知道是什么东西,于是查了一下,留一篇文章记录

this指针是什么?

在C++中,类里面的成员函数可以访问类的成员变量,但是有时候可能会有参数名和成员变量名相同的情况。这时候,可能需要用某种方式来区分它们。比如,在构造函数中,参数名如果和成员变量名一样,就需要用this指针来指定成员变量。也就是说,在类的非静态成员函数中,this指针指向调用该函数的对象实例。这样的话,通过this可以访问该对象的所有成员,包括成员变量和成员函数。

那具体什么时候会用到this呢?

1. 解决成员变量与参数名称冲突

当成员函数的参数名与类的成员变量名相同时,使用this->变量名明确指向成员变量。
示例:

1
2
3
4
5
6
7
8
class MyClass {
private:
int x;
public:
void setX(int x) {
this->x = x; // 使用this消除歧义
}
};

2.链式调用(返回对象自身)

通过返回*this,支持连续调用同一对象的多个成员函数。

示例:

1
2
3
4
5
6
7
8
9
10
11
class Counter {
int count;
public:
Counter& increment() {
count++;
return *this; // 返回自身引用
}
};

Counter c;
c.increment().increment(); // 链式调用

3. 防止自赋值

在赋值运算符重载中,检查this与待赋值对象地址是否相同,避免资源重复释放。

示例:

1
2
3
4
5
6
7
8
9
class MyClass {
public:
MyClass& operator=(const MyClass& other) {
if (this != &other) { // 检查自赋值
// 执行赋值操作
}
return *this;
}
};

4. 传递当前对象指针或引用

将对象自身传递给外部函数或作为回调参数。

示例:

1
2
3
4
5
6
7
class Button {
public:
void onClick() {
// 将this传递给事件处理器
EventHandler::registerCallback(this);
}
};

理解:

1. this的本质

类型:在类的非静态成员函数中,this的类型是ClassName(例如MyClass)。

指向目标:this指向调用该成员函数的对象实例(即具体的某个对象),而非“类”本身。

2. 为什么是“对象实例”而不是“类”?

类的成员函数属于类:类的成员函数代码在内存中只有一份,被所有对象共享。

对象的数据独立存在:每个对象实例有自己的成员变量存储空间。

this的作用:在调用成员函数时,this会隐式传递当前对象的地址,让函数知道要操作哪个对象的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Dog {
public:
string name;
void bark() {
// 这里的this指向调用bark()的Dog对象(如d1或d2)
cout << this->name << "在叫!" << endl;
}
};

Dog d1, d2;
d1.name = "旺财";
d2.name = "小黑";

d1.bark(); // this指向d1,输出"旺财在叫!"
d2.bark(); // this指向d2,输出"小黑在叫!"

同一个bark()函数,通过不同的this指针,操作不同对象的数据。