C++类和对象-4

news2024/11/24 7:23:48

在上篇C++类和对象的博客中,我们讲述了析构函数、拷贝构造函数、浅拷贝和深拷贝的内容,我们紧接上文,开始讲述接下来的文章。

目录

1.this指针

1.1引入

1.2内容

1.3特征

1.4用法

2.静态成员

2.1内容

2.2静态数据成员

2.3静态成员函数

2.4实践

1.this指针

1.1引入

了解this指针之前,我们先来看一段代码:

#include<iostream>

class A {
private:
	int x, y, z;
public:
	A(int xvalue = 0, int yvalue = 0, int zvalue = 0) {
		x = xvalue;
		y = yvalue;
		z = zvalue;
	}
	void show() { // const A * this
		std::cout << "(" << x << "," << y << "," << z << ")\n";
	}
};

int main() {
	A a1(1, 1, 1), a2(2, 2, 2);
	a1.show();
	system("pause");
	return 0;
}

毫无疑问这是一段十分简单的代码,它的输出结果即是对象a1的打印。问题是:我们同时定义了a1和a2两个对象,但是我们在打印函数show中并未对具体的对象加以区分,那么show怎么清楚它需要打印对象a1而不是对象a2。

这并非是一个简单的a1.show()就可以阐述清楚的,虽然凭借这样的语法格式,我们可以很明显的理解出是对a1对象的打印,但是我们需要细究其中的底层逻辑,即编译器是怎么理解这一段代码的。

1.2内容

于是,为了面对上述问题,C++引入this指针来处理这种情况,即C++编译器会为每一个“非静态成员变量的成员函数”添加一个隐藏指针,这个指针便是this指针。

在函数被调用中,this指针会去指向当前调用函数运行的对象,并且在接下来函数体中所有类的成员变量操作,都是通过this指针去访问的。这是一个透明操作,即整个过程并不需要用户去完成和传递,编译器会自动完成。

1.3特征

this指针存在以下常见的四种特征:

  • this指针被const修饰,意味着在成员函数中,它不能被赋值;
  • this指针只能在成员函数内部使用;
  • this指针本质上是非静态成员函数的形参,当对象调用成员函数时,会将对象的地址作为实参传递给this形参,所以对象中不储存this指针;
  • this指针是非静态成员函数中第一个隐藏指针形参,一般由编译器通过寄存器(VS中是ECX)自动传递。

1.4用法

this指针的用法由很多,在此我简单讲述两种:一种是可以用来区分成员和非成员;另一种是可以用来返回当前对象的引用,具体我们通过下述代码理解:

#include<iostream>

class A {
private:
	int x, y, z;
public:
	A(int x = 0, int y = 0, int z = 0) {
		//使用this指针区分成员和非成员,如此我们可以不关注成员和非成员名称的一致性。
		this->x = x; 
		this->y = y;
		(*this).z = z;
	}
	void show() { // const A * this
		std::cout << "(" << x << "," << y << "," << z << ")\n";
	}
	A& ret() {
		return *this;//返回当前对象的引用
	}
};

int main() {
	A a1(1, 1, 1), a2(2, 2, 2);
	(a1.ret()).show();
	system("pause");
	return 0;
}

最后的执行结果依旧是对象a1的内容打印。

2.静态成员

2.1内容

在有些时候我们需要对全局数据加以统计,此时采用全局变量不一定安全,并且会破坏C++的封装,因此我们引入静态成员的概念来完成对该任务的实现,不过静态成员的作用远不止于此。‘

当我们在使用static关键字将类成员定义为静态成员时,这便意味着无论后续定义多少份该类的对象,此静态成员只会存在一份(类的范围内所有对象共享该数据),静态成员可以声明为公有的、私有的或是保护的。

接下来根据静态关键字可以修饰的不同对象类型,即数据成员和函数成员,我们将其分开讲述。

2.2静态数据成员

静态数据成员不属于任何一个对象,它在程序编译时创建并初始化,所以它在该类的任何对象初始化之前便已经完成了创建。

2.3静态成员函数

静态成员函数可以在类中定义也可以在类外定义(类外定义不用static前缀),它一般用于访问全局变量或是一个类中的静态数据成员,可以用于建立任何对象之前处理静态数据成员,并且对于静态成员函数而言,它不能访问类中的非静态数据成员,它也不存在this指针。

2.4实践

了解完内容之后,我们来通过具体的代码进行深入理解。

#include<iostream>

class Student {
public:
	//静态成员:人数和总分
	static int total;
	static double sum;

	//构造函数
	Student(double score = 0.0) {
		this->score = score;
		//每次创建对象则人数和总分随之增加
		total++;
		sum += score;
	}

	//静态成员函数,访问静态成员
	static int get_total() {
		return total;
	}
	static double get_sum() {
		return sum;
	}

private:
	//个人得分
	double score;
};

//静态成员需在类外完成初始化
int Student::total = 0;
double Student::sum = 0;

int main() {
	std::cout << "before:\n" << "人数:" << Student::get_total() << "," << "总分:" << Student::get_sum() << std::endl;
	Student s1(90);
	Student s2(91);
	Student s3(92);
	std::cout << "final:\n" << "人数:" << Student::get_total() << "," << "总分:" << Student::get_sum() << std::endl;
	return 0;
}

最后我们得到执行结果为:

这便很好的说明了静态成员的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue.js 中的国际化支持是什么?如何进行国际化支持?

Vue.js 中的国际化支持是什么&#xff1f;如何进行国际化支持&#xff1f; Vue.js 是一款流行的前端框架&#xff0c;它提供了许多方便的工具和 API&#xff0c;用于构建交互式的用户界面。其中&#xff0c;国际化支持是 Vue.js 中重要的一部分&#xff0c;它可以让我们轻松地…

如何强制删除文件夹?这样操作就能搞定!

案例&#xff1a;我想删掉一些没有用的文件夹&#xff0c;释放一些电脑内存&#xff0c;但是我发现&#xff0c;有些文件夹并不能直接被删除。怎样才能删除这些文件夹&#xff1f;有没有小伙伴有解决的办法。 在使用电脑过程中&#xff0c;我们可能会遇到一些无法正常删除文件夹…

空间计算时代来临:苹果Vision Pro震撼上市,探索真实与虚拟的新边界

目录 前言Vision Pro的外观设计Vision Pro的交互方式Vision Pro 硬件配置Vision Pro 上市时间及销售价格Vision Pro与传统XR设备不同点总结其它资料下载 前言 苹果公司在2023年6月6日的WWDC23主题演讲中正式发布了传闻已久的头显产品——Vision Pro。WWDC&#xff0c;全称为“…

LLM Accelerator:使用参考文本无损加速大语言模型推理

编者按&#xff1a;如今&#xff0c;基础大模型正在诸多应用中发挥着日益重要的作用。大多数大语言模型的训练都是采取自回归的方式进行生成&#xff0c;虽然自回归模型生成的文本质量有所保证&#xff0c;但却导致了高昂的推理成本和长时间的延迟。由于大模型的参数量巨大、推…

被App包围 苹果Vision Pro将你推入空间“大屏”

2小时&#xff0c;这是2023年苹果开发者大会&#xff08;WWDC&#xff09;首日发布会的直播总时长&#xff0c;仅YouTube上&#xff0c;就有483.9万次观看。发布会开启时&#xff0c;北京时间是6月6日凌晨1点&#xff0c;众多科技博主串流直播了这场发布会。 苹果CEO蒂姆库克引…

3.2 继续完善的Vue.js响应式系统

前文提要&#xff1a; 3.0 响应式系统的设计与实现 3.1 一个稍微完善的Vue.js响应式系统 1、解决副作用函数的死循环问题 在解决了分支的切换的问题&#xff0c;此时还有一个代码死循环的问题&#xff0c;其这个死循环很容易触发&#xff0c;如下代码&#xff1a; const dat…

Netty Incubator Codec QUIC 0.0.41.Final 发布

导读Netty Incubator Codec QUIC 是一款基于 QUIC 协议的编解码器&#xff0c;为 Netty 提供了 QUIC 协议的支持。 近日&#xff0c;该团队发布了 0.0.41.Final 版本&#xff0c;这是一个错误修复版本&#xff0c;主要包括以下变化: 允许在派发前通过添加到读完队列来合并刷新…

嵌入式软件测试笔记3 | 嵌入式软件测试开发的多V模型

3 | 嵌入式软件测试开发的多V模型 1 简单的多V模型2 迭代与并行开发2.1 开发模型2.2 嵌入式开发过程的复杂性 3 多V模型中的测试活动3.1 测试活动和因素3.2 模型开发周期中与测试相关的元素分配3.3 原型开发周期中与测试相关的元素分配3.4 最终产品开发周期中与测试相关的元素分…

NineData x 华为云正式上线

6月5日&#xff0c;NineData 企业级 SQL 开发平台正式成为华为云“联营联运”商品。通过联营联运模式&#xff0c;双方将在产品、解决方案和生态等多个方面开展深度合作&#xff0c;共同提供高效、智能、安全的数据管理服务&#xff0c;帮助客户轻松构建一站式云端数据库管理平…

【随想录】一篇水文

前排许愿池: 我是一个没有梦想的咸鱼捏 自从知道成电优营了也不给offer之后 遂开始摆烂了(哈哈) 以及看了一下数据 好像前期存的资本够多的话 后面还是能混混的 however,已经快过去2/3了 前排致谢: 感谢好人一姐的助力 果然人是靠别人活着的 或者说伟人是站在巨人…

基于显扬科技3D视觉相机的芯片外观检测系统

Part.1 行业背景 电子元器件制造业是我国的支柱产业之一&#xff0c;具有产量大、技术投入高的特点&#xff0c;因此产品质量把控与生产成本优化是电子行业关注的发展重点。 芯片作为电子元器件中的核心组成部分&#xff0c;在现代社会被广泛应用&#xff0c;在芯片生产制造过…

Redis经典五大数据类型源码及底层实现

Redis经典五大数据类型源码及底层实现 一 面试题引入二 Redis数据类型的底层数据结构三 redis是字典数据库&#xff0c;KV键值对到底是什么&#xff1f;3.1 怎样实现键值对&#xff08;key-value&#xff09;数据库的&#xff1f;3.2 redisObject结构的作用3.3 RedisObject各字…

微信支付商户接入指引(企业)

目录 一、官方指引二、申请规则三、申请流程&#xff08;一&#xff09;提交资料&#xff08;二&#xff09;签署协议&#xff08;三&#xff09;绑定场景 一、官方指引 https://kf.qq.com/faq/210423UrIRB7210423by6fQn.html 二、申请规则 1、微信支付商家仅面向企业、个体…

三分钟告诉你录音实时转写软件哪个好

真的不想录音笔记实时转写软件有哪些吗 录音实时转写软件免费有哪些&#xff1f;录音实时转写软件推荐 实时录音转文字软件哪个好&#xff1f;录音实时转写软件分享 录音实时转写软件哪个好&#xff1f;录音实时转写软件盘点 让你知道视频配音文字转语音软件有哪些 让你不…

耗时1周整理了网络安全学习路线,非常详细!

前言 这一期就出一个怎么学习网络安全的学习路线和方法&#xff0c;觉得有用的话三连收藏下 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xff0c;有些人会倒在学习linux系统及命令的路上…

selenium基础语法

文章目录 selenium基础语法1.定位页面元素2.元素的操作1) 模拟键盘输入(send_keys)2) 点击操作(click)3) 清除去对象输入的文本内容(clear)4) 获取文本(gettext) 3. 等待4. 信息打印5. 窗口6. 导航7. 弹窗8. 鼠标和弹窗9.选择框10.文件上传11.屏幕截图 selenium基础语法 1.定位…

面试官问:kafka为什么如此之快?

前言 天下武功&#xff0c;唯快不破。同样的&#xff0c;kafka在消息队列领域&#xff0c;也是非常快的&#xff0c;这里的块指的是kafka在单位时间搬运的数据量大小&#xff0c;也就是吞吐量&#xff0c;下图是搬运网上的一个性能测试结果&#xff0c;在同步发送场景下&#…

OpenStack介绍

OpenStack 1. OpenStack1.1 简介1.2 OpenStack和KVM有什么关系和区别&#xff1f;1.3 编写语言 2. 主要模块介绍2.1 OpenStack计算设施 - Nova1. API服务器&#xff08;nova-api&#xff09;2. 消息队列&#xff08;Rabbit MQ Server&#xff09;3. 运算工作站&#xff08;nova…

LibTorch部署图像处理相关算法详细教程(附代码)

深度学习图像处理相关代码LibTorch部署详细教程 前言LibTorch简介LibTorch环境安装及问题解决LibTorch涉及的Tensor基本操作张量初始化张量变形张量截取张量间操作 部署过程测试环境推理过程代码Demo扩展部分 前言 本文写于调研深度学习部署方法工作中&#xff0c;需要将图像分…

如何将PDF转Excel并保持原有格式不变?分享三个方法给大家!

在日常办公中&#xff0c;我们常常面临一个问题&#xff1a;领导给我们发了一个PDF文件&#xff0c;并要求我们尽快修改其中的表格数据。然而&#xff0c;当我们将PDF文件转换成Excel格式时&#xff0c;经常会出现文件排版错乱的情况。时间的紧迫和数据的混乱可能会让我们感到十…