Cherno C++学习笔记 P42 this关键字
这一篇文章我们会讲一下this关键字。这个对于类和实例化的对象来说也是很重要的,因为它是指向我们实例化了的对象的指针。比如说我们在一个类的函数当中,我们希望找到一种办法可以指向这个实例化的对象,那么C++给我们的答案就是this指针。当然需要注意的一点是,我们必须先实例化,然后才能使用this指针。换句话说,如果不实例化,这个对象在内存中都不存在,又哪来的指针能够指向它呢?
我们举一个例子来看看this是怎么使用的。还是用一个简单的Entity类:
class Entity {
public:
float x, y;
public:
Entity(float x, float y)
:x(x), y(y){}
};
我们可以用列表的方式写构造函数,但是如果我们用常规的方式来写,就会发现:
Entity(float x, float y) {
x = x;
y = y;
}
我们无法区分清楚到底哪里是输入变量x,哪里是类自带的x成员变量,而且我们真的这么写的话,相当于用输入的值去覆盖输入的值,这样编译器会给我们提示有问题。那么我们想要说明,前面的x和y是类自带的成员变量,那么就需要this指针。我们可以定义一个指针等于this,然后用它指向这两个变量:
Entity(float x, float y) {
Entity* e = this;
e->x = x;
e->y = y;
}
或者我们直接使用this:
Entity(float x, float y) {
this->x = x;
this->y = y;
}
且根据我使用VS2022实际测试,如果采用先用this赋值再初始化的方式,还是会有错误产生,所以在使用最新的编译器的时候,需要我们直接使用this。
如果我们把鼠标放在this上,可以看到this的类型,就是普通的Entity*类型,所以我们可以直接拿来给Entity*类型的变量赋值,当然也可以赋值给const类型的指针,但是我们通常不这样做,因为这样做的话就意味着我们无法修改了。
然而,在不同的函数中,当我们把鼠标放在this指针上的时候,会发现它会呈现不同的类型,比如如果我们有一个const函数,我们想要使用this指针:
int GetX() const {
const Entity* e = this;
}
这个时候我们把鼠标放在this上面,我们会看到this的类型是const Entity*, 此时它就成为了一个不能改变内容的指针,当然也是符合我们的预期的,因为我们预期这类函数就是不能修改类当中的变量的。此时在我们声明e指针的时候,如果我们不加上const,会因为可能修改我们的类的内容而发生报错,这个也是之前我们在讲const的时候提到过的。
除了直接在类的方法中这样使用,我们还可以用this来让我们能够使用在类的外面定义的函数,比如我们定义了这样一个函数:
static void Print(Entity* e) {
std::cout << "Entity" << std::endl;
}
它位于类的定义的外面,那么如果我们类内部的方法想要使用这个函数,那我们直接用如下的方法使用即可,此时this需要作为Print函数的实参:
class Entity {
private:
float x, y;
public:
Entity(float x, float y) {
this->x = x;
this->y = y;
Print(this);
}
};
这样我们就可以在类内部使用外部的函数了。
当然,如果我们的函数接受的形参是const引用,那么我们直接对this进行解引用操作就可以啦
class Entity {
private:
float x, y;
public:
Entity(float x, float y) {
this->x = x;
this->y = y;
Print(*this);
}
};
static void Print(const Entity& e) {
std::cout << "Entity" << std::endl;
}
好了,以上就是有关于this指针的全部内容了,希望大家喜欢!