当前位置: 首页 > article >正文

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指针的全部内容了,希望大家喜欢!


http://www.kler.cn/a/444534.html

相关文章:

  • Ubuntu 22.04,Rime / luna_pinyin.schema 输入法:外挂词库,自定义词库 (****) OK
  • ECharts柱状图-柱图42,附视频讲解与代码下载
  • 防御 XSS 的七条原则
  • Linux安装部署Redis(超级详细)
  • Python Post JSON 下载压缩包
  • WebGPU跨平台应用开发
  • 在C#中使用资源保存图像和文本和其他数据并在运行时加载
  • Hive是什么,Hive介绍
  • 人机交互中的代理与替代
  • 基于Spring Boot的校园共享系统
  • LeetCode771 宝石与石头
  • React 19新特性探索:提升性能与开发者体验
  • scala中模式匹配的应用
  • 前端面试宝典
  • git怎么修改远程main分支为master分支
  • 系列2:基于Centos-8.6Kubernetes 集成GPU资源信息
  • Message Processing With Spring Integration高级应用:自定义消息通道与端点
  • 期末复习-数据库原理(全英教材)
  • Oracle 三个生产案例问题分析
  • 5G 模组 RG200U常用AT命令