【C++】类和对象(二):this指针

大家好,我是苏貝,本篇博客带大家了解C++的this指针,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • 1 this指针的引出
  • 2 this指针的特性

1 this指针的引出

我们先来定义一个日期类Date

在这里插入图片描述
在这里插入图片描述

问:Date的对象d1,d2调用的Print是同一个函数吗?是的,根据我们之前学的,类的对象里只存储成员变量,成员函数在公共代码区中。我们也来证明一下,来看汇编代码,确实是的

在这里插入图片描述

现在我们给2个对象初始化

在这里插入图片描述
在这里插入图片描述

问:既然2个对象的Print是同一个函数,且函数体中没有关于不同对象的区分,那么为什么d1调用的Print函数知道3个变量是d1初始化的值而非d2初始化的值?

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数this,让this指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过this去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。也就是说,this指针对用户来说是隐含的

即编译器看到的Print函数
在这里插入图片描述

编译器看到的2个对象调用Print函数
在这里插入图片描述

编译器看到的给我们看也并不默认啊,我们在数据结构里写的实现顺序表里也会这样写。
在这里插入图片描述

所以引入隐含的this指针后,d1调用的Print函数就知道3个变量是d1初始化的值而非d2初始化的值

2 this指针的特性

  1. this指针的类型:类的类型* const,即成员函数中,不能改变this指针的指向(指向调用该成员函数的对象)。

  2. 只能在“成员函数”的内部使用

  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针。

  4. this指针是“成员函数”隐含的第一个指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

  5. 虽然成员函数有隐含的实参(调用该函数的对象的地址)和形参(this指针),但是我们不能写出来

在这里插入图片描述

  1. 不能将形参this写出来,但是我们可以在成员函数内使用
    在这里插入图片描述

  2. 不能修改this指针的指向

在这里插入图片描述

在这里插入图片描述

直接插入排序的特性总结:
问题:this存在哪里?
a. 栈区 b. 堆区 c. 静态区 d. 常量区 e. 对象中

答案:a ,因为它是函数形参,所以在栈区。
先排除e.对象中,它是成员函数的形参,成员函数在公共代码区而非对象中,形参肯定也不能在对象中。堆区是有关动态开辟内存的,排除。静态区存全局变量和静态变量(被static修饰的变量),排除。
会不会因为this的类型是 类的类型* const,有const所以觉得是常量区呀?不是的,C++中const修饰的变量不是在常量区。看下图
在这里插入图片描述

变量i和p都是有const修饰,j是普通变量,但它们的地址是连着的,都是在栈区。这里面只有p指向的“hello world“是在常量区。

问题:this指针可以为空吗?

1. 下面程序编译运行结果是?

A、编译报错 B、运行崩溃 C、正常运行
在这里插入图片描述
在这里插入图片描述

答案:C.正常运行
语法没有问题,所以不是编译报错。可p是空指针,p->解引用了,不是应该运行崩溃吗?不是的,编译器只会按需求做事,不是写了解引用它就会解引用,而是需要用到指针指向的内容时才会解引用。回到本题,Print函数不在对象里,所以根本不需要堆指针p解引用,因此程序正常运行。

2. 下面程序编译运行结果是?

A、编译报错 B、运行崩溃 C、正常运行

在这里插入图片描述

答案:B. 运行崩溃
语法没有问题,所以不是编译报错。这个PrintA函数需要用到对象里的成员变量,所以编译器要对p解引用,p是空指针,因此运行崩溃


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

华为原生鸿蒙操作系统的发布有何重大意义和影响:

#1024程序员节 | 征文# 一、华为原生鸿蒙操作系统的发布对中国的意义可以从多个层面进行分析: 1. 技术自主创新 鸿蒙操作系统的推出标志着中国在操作系统领域的自主创新能力的提升。过去,中国在高端操作系统方面依赖于外国技术,鸿蒙的发布…

HttpContext模块 --- http上下文模块

目录 模块设计思想 模块代码实现 模块设计思想 上下文模块是Http协议模块中最重要的一个模块,他需要控制请求处理的节奏,需要保存一个HttpRequest对象,后续关于这个连接的http的处理的信息全部都是在这个上下文中保存。 首先,…

等保测评与风险管理:识别、评估和缓解潜在的安全威胁

在信息化时代,数据已成为企业最宝贵的资产之一,而信息安全则成为守护这份资产免受侵害的重中之重。等保测评(信息安全等级保护测评)作为保障信息系统安全的重要手段,其核心在于通过科学、规范、专业的评估手段&#xf…

autMan奥特曼机器人-内置容器安装依赖报错:externally-managed-environment

在 Manjaro 22、Ubuntu 23.04、Fedora 38 等最新的linux发行版中运行pip install时,通常会收到一个错误提示:error: externally-managed-environment,即“外部管理环境”错误,但这不是一个 bug。 $ sudo pip3 install please-cli…

word记录

1.段落 https://word-agent.zaixianjisuan.com/fangan/wordwen-dang-ru-he-zi-xing-fen-duan-luo.html 1.1 Word中自己分段落的方法 在Word文档中,合理地分段落可以使文档更加清晰易读。以下是几种在Word中自己分段落的方法。 使用回车键分段:最简单的…

【Android】Convenient ADB Commands

Install adb install -r <path>Uninstall adb uninstall <pkg>Start adb shell am start -n <pkg>/.SplashActivityStop adb shell am force-stop <pkg>Reset adb shell pm clear <pkg>Reboot adb rebootShutdown adb reboot -p

开发涉及的安全规范整理

文章目录 前言安全场景与措施API调用方式鉴权参数校验日志打印数据保存加密 总结 前言 这篇文章我们来整理下写代码和方案设计中的安全规范问题&#xff0c;内容偏服务端&#xff0c;即使是入门的新人&#xff0c;如果你对安全有所了解会让成熟规范的团队对你高看一眼。安全经常…

训练集alpaca、sharegpt格式

LLaMA-Factory微调支持的格式 支持 alpaca 格式和 sharegpt 格式的数据集。 Alpaca格式 格式: [{"instruction": "人类指令(必填)","input": "人类输入(选填)","output": "模型回答(必填)","syst…

LLaMA Factory环境配置

LLaMA-Factory官方文档 安装正确的torch和cuda版本 参考&#xff1a; PyTorch 报错解决 1.ImportError: /usr/lib/x86_64-linux-gnu/libstdc.so.6: version GLIBCXX_3.4.29 not found 参考这个解决&#xff1a;丝滑解决ImportError: /usr/lib/x86_64-linux-gnu/libstdc.s…

用HTML构建酷炫的文件上传下载界面

1. 基础HTML结构 首先&#xff0c;我们构建一个基本的HTML结构&#xff0c;包括一个表单用于文件上传&#xff0c;以及一个列表用于展示已上传文件&#xff1a; HTML <!DOCTYPE html> <html> <head><title>酷炫文件上传下载</title><link …

健康养生的重要性

养生之道&#xff0c;健康相随 在快节奏的现代生活中&#xff0c;养生健康已成为我们不可忽视的话题。随着生活水平的提高&#xff0c;人们越来越注重身体的保养与健康的维护。那么&#xff0c;如何才能做到养生健康&#xff0c;让身体与心灵都得到滋养呢&#xff1f; 首先&a…

鱼跃医疗助力退役军人事务部“高原情暖老兵项目”

10月17日-22日&#xff0c;在退役军人事务部指导下&#xff0c;中国老龄事业发展基金会联合腾讯SSV时光实验室、腾讯天籁实验室等机构发起的“情暖老兵&#xff0c;守望相助—老兵听力关怀计划”项目走进西藏&#xff0c;为退伍老兵提供听力健康筛查服务。西藏鱼跃医疗投资有限…

JSON Schema

简介 JSON Schema是一种用于描述 JSON 数据结构的规范&#xff0c;它提供了一种标准化的方式来定义JSON的数据格式、验证规则以及约束&#xff0c;使得开发者可以确保传递的数据符合预期的结构和格式。通常我们把它用来描述 OpenAPI 的入参和出参。 相关文档&#xff1a; htt…

我的电脑问题

联想小新Pro14外接显示器无法显示 问题描述&#xff1a; 联想小新 Pro14 电脑的外界显示器突然不好使了&#xff0c;使用以下办法成功解决 解决办法—重置EC 重置EC的方法&#xff1a; 关机后&#xff0c;移除电脑的外接电源以及u盘、鼠标等所有的外接设备&#xff1b; 在不接…

fastGpt

参考本地部署FastGPT使用在线大语言模型 1 rockylinx 1 ollama安装 在rockylinux中安装的&#xff0c;ollama由1.5G&#xff0c;还是比较大&#xff0c;所有采用在windows下下载&#xff0c;然后安装的方式&#xff0c;linux安装 tar -C /usr -xzf ollama-linux-amd64.tgz #…

U-net医学分割网络——学习笔记

《U-Net: Convolutional Networks for Biomedical Image Segmentation》 一、提出背景 U-Net 的提出是为了解决生物医学图像分割的几个关键问题&#xff1a;需要像素级的精确分割、标注数据稀缺、滑动窗口方法效率低以及多尺度特征融合的需求。U-Net 通过对称的 U 型全卷积结…

Redis+Lua限流的四种算法

1. 固定窗口&#xff08;Fixed Window&#xff09; 原理&#xff1a; 固定窗口算法将时间划分为固定的时间段&#xff08;窗口&#xff09;&#xff0c;比如 1 秒、1 分钟等。在每个时间段内&#xff0c;允许最多一定数量的请求。如果请求超出配额&#xff0c;则拒绝。 优点…

【linux网络编程】| 网络套接字socket | 初识网络开发

前言&#xff1a;本篇内容将要正式进入网络的编程当中。 本篇的目的是为了能够看完就可以上手写一些网络代码了。 但是本篇也并不会单纯的只讲接口&#xff0c; 前面还是会铺垫一些理论知识更好的认识网络传输。下面&#xff0c; 开始我们的学习吧! ps&#xff1a;本篇内容的某…

摄像头点击器常见问题——摄像头视窗打开慢

【嵌入式开发】可编程4k蓝牙摄像头点击器_能编程的摄像头-CSDN博客 拥有上述文章产品的朋友出现标题所述问题&#xff0c;可继续往下阅读 出现以上问题&#xff0c;摄像头画面打开较慢&#xff0c;可以按以下操作进行设置 在环境变量里设置一下这个参数&#xff0c;值设置为1&…

代码工艺:SQL 优化的细节

1. 巧用 limit 当出现深分页的时候&#xff0c;例如&#xff1a; select id, name, status, detail from product limit 100000, 30; 那么MySQL的执行方式为&#xff1a;一共需要查100030条数据&#xff0c;然后丢弃前面的100000条&#xff0c;只返回后面的30条数据&#xf…