this指针
是指向当前对象实例的指针,该方法属于这个对象实例。
1.什么是this
指针?
之前第36课中,我们已经学习了成员初始化列表(Member Initializer Lists),它可以帮助我们方便、快捷且在性能上有优势地初始化
class Entity {
public:
int x, y;
Entity(int x, int y)
:x(x), y(y) {}
};
如果我想要在构造函数内部初始化,我要怎么写呢?这样吗?
Entity(int x, int y) {
x = x;
y = y;
}
显然,想也知道这是不可能的,我们肉眼都分不出来x是类中的成员变量还是参数。如果你在VS中使用的话可以看到,两个x
都是参数的x
。(这个其实类似于全局变量和函数参数,在同名的情况下会优先使用函数参数,更底层的原因还没学到)
那我们怎么引用这个类的成员x
呢,这就是this
this
是指向当前对象的指针
Entity(int x, int y) {
this->x = x;
this->y = y;
}
2.this
的特性
this
作为指向对象的指针,它有一些特性。
2.1this
的类型
是类的指针,这里我定义的是Entity类
,它就是Entity*
。(在旧版本VS中,是const Entity*
)
2.2 const方法
中的this
在第34讲中我们学习过,类的方法可以用const关键字
,保证方法不会修改类成员变量。
在const方法
中,this
的类型会变成const Entity*
。如果将this赋值给其他指针,同样要求指针是const Entity*
,防止你使用this
或与其值相同的指针
修改指针指向的内容
注:const放在指针前是不允许修改指针指向的内容,在第34讲。
下面是一个例子,GetX()
方法中你无法使用this
或者与它相等的e
去修改成员变量x
3.this
的使用
3.1 用于调用实例本身
当类外部函数被类内部方法调用时,this
可能会有用
比如:如果我们有一个打印Entity类
的函数,我们想要在构造函数中调用。
void PrintEntity(Entity* e);
class Entity {
public:
int x, y;
Entity(int x, int y) {
this->x = x;
this->y = y;
PrintEntity(this);
}
};
像这时,我们就需要this
指针指向对象实例
如果你是常量引用,那就写成解引用this即可(关于引用的知识在17讲)
void PrintEntity(const Entity& e);
class Entity {
public:
int x, y;
Entity(int x, int y) {
this->x = x;
this->y = y;
PrintEntity(*this);
}
};
3.2 delete this
最好不要尝试的事
delete this
会消灭你的对象,别这么干,短时间内碰不到可以使用的场景。
学习资料来源:https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb
欢迎大家关注视频原作者cherno,本文是我对其视频的学习笔记。