【C++】总结4-this指针

文章目录

  • 什么是this指针
  • this指针存在的意义
  • this指针的特性
  • this指针存在哪里
  • this指针可以为空吗

什么是this指针

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

this指针存在的意义

this指针是一个指向当前对象的指针,用于在非静态成员函数中访问当前对象的成员。

主要意义:

  • 区分对象实例:类的代码段是共享的,每个对象实例只保存自己的成员数据,this指针确保每个成员函数正确的访问属于当前对象实例的成员

  • 隐式传递:this指针是隐式传递给非静态成员函数的一个特殊参数。在调用非静态成员函数时,编译器会自动在底层将调用该函数的对象的地址作为this指针传递给该函数。这样,我们在定义成员函数时无需显式声明this参数,而在调用成员函数时也不需要手动传递对象的地址

  • 成员访问:this指针使得成员函数可以访问当前对象的非静态成员变量和其他非静态成员函数,它扮演着连接成员函数与对象的桥梁,使得成员函数能够操作所属的对象

this指针的特性

  • this指针的类型:类类型*const
  • 只能在成员函数的内部使用
  • this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参
  • this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

this指针存在哪里

编译器在生成程序时加入了获取对象首地址的相关代码。并把获取的首地址存放在了寄存器ECX中(VC++编译器是放在ECX中,其它编译器有可能不同)。也就是成员函数的其它参数正常都是存放在栈中。而this指针参数则是存放在寄存器中。类的静态成员函数因为没有this指针这个参数,所以类的静态成员函数也就无法调用类的非静态成员变量。

this指针可以为空吗

可以为空,当我们在调用函数的时候,如果函数内部并不需要使用到this,也就是不需要通过this指向当前对象并对其进行操作时才可以为空(当我们在其中什么都不放或者在里面随便打印一个字符串),如果调用的函数需要指向当前对象,并进行操作,则会发生错误(空指针引用)

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

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

相关文章

Java NIO Files类读取文件流方式详解

Java NIO Files类读取文件流方式详解 Files类原理概述 java.nio.file.Files是Java标准库提供的一个工具类,用于操作文件和目录。它提供了一系列静态方法,可以用于创建、复制、删除、移动、重命名、读取、写入文件和目录等常见的文件系统操作。同时&…

Xml文件相关操作

Xml文件相关操作 C#中的XML是一种可扩展标记语言(Extensible Markup Language),用于存储和交换数据。在C#中,我们可以使用内置的System.Xml命名空间来处理和操作XML数据。 一、关键概念 1. 标签(Tags) …

代码随想录算法训练营第31天| 455.分发饼干 376. 摆动序列 53. 最大子序和

今日学习的文章链接&#xff0c;或者视频链接 第八章 贪心算法 part01 自己看到题目的第一想法 看完代码随想录之后的想法 455: class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(),g.end());sort(s.…

7D透明屏的市场应用广泛,在智能家居中有哪些应用表现?

7D透明屏是一种新型的显示技术&#xff0c;它能够实现透明度高达70%以上的显示效果。这种屏幕可以应用于各种领域&#xff0c;如商业广告、展览展示、智能家居等&#xff0c;具有广阔的市场前景。 7D透明屏的工作原理是利用光学投影技术&#xff0c;将图像通过透明屏幕投射出来…

Talk | 南洋理工大学博士后研究员李祥泰:基于Transformer的视觉分割模型总结、回顾与展望

​ 本期为TechBeat人工智能社区第517期线上Talk&#xff01; 北京时间7月27日(周四)20:00&#xff0c;南洋理工大学博士后研究员—李祥泰的Talk已经准时在TechBeat人工智能社区开播了&#xff01; 他与大家分享的主题是: “基于Transformer的视觉分割模型总结、回顾与展望”&am…

C#多线程

C#多线程 C#多线程是C#学习中必不可少的知识&#xff0c;在实际开发中也能有效的提升用户体验&#xff0c;和程序性能。 文章目录 C#多线程前言一、什么是线程、什么是进程、什么是协程&#xff1f;协程优点缺点 线程优点缺点&#xff1a; 进程优点缺点&#xff1a; 二、C# 中…

使用Spring Boot实现Redis键过期回调功能

使用Spring Boot实现Redis键过期回调功能 当使用Redis作为缓存或数据存储的时候&#xff0c;有时候需要在键过期时执行一些特定的操作&#xff0c;比如清除相关数据或发送通知。在Spring Boot中&#xff0c;可以通过实现RedisMessageListener接口来实现Redis键过期回调功能。下…

基于“RWEQ+”集成技术在土壤风蚀模拟与风蚀模数估算、变化归因分析中的实践应用及SCI论文撰写

查看原文>>>基于“RWEQ”集成技术在土壤风蚀模拟与风蚀模数估算、变化归因分析中的实践应用及SCI论文撰写 土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一&#xff0c;土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。…

B2B企业如何选择CRM系统?

CRM软件的优势在于简化业务流程&#xff0c;实现企业的降本增效。越来越多的B2B企业通过CRM为业务赋能&#xff0c;B2B企业如何快速找到适合公司业务的CRM系统&#xff1f;总的来说就是根据企业自身业务而量身打造的一套系统。 1.整理业务需求 B2B企业首先要考虑是业务痛点&a…

MySQL绿色安装和配置

1、 从地址http://dev.mysql.com/downloads/mysql/中选择windows的版本下载。 2、 mysql各个版本的简介 &#xff08;1&#xff09; MySQL Community Server 社区版本&#xff0c;开源免费&#xff0c;但不提供官方技术支持。 &#xff08;2&#xff09; MySQL Enterprise Ed…

Spring MVC

一、什么是MVC MVC就是一种思想&#xff0c;而Spring MVC是对MVC思想的具体实现 MVC是Model View Controller的所缩写&#xff0c;是一种软件架构模式&#xff0c;它将软件系统Fenwick墨香&#xff0c;视图和控制器三个基本部分。 Model&#xff1a;是应用程序中用于处理应用…

对各种项目梳理Maven、SpringBoot等介绍

对于maven 项目 首先结束pom.xm依赖库 https://www.cnblogs.com/zhangweizhong/p/13582903.html plugin插件 maven项目中pom.xml的build中的plugin你真的了解过吗&#xff1f;都是干货_pom 中plugin_is me monday的博客-CSDN博客

7.27 Qt

制作简易小闹钟 Timer.pro QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # dep…

网站SEO优化:提升搜索排名与流量引爆

导言&#xff1a; 在互联网时代&#xff0c;网站SEO&#xff08;搜索引擎优化&#xff09;是提高网站搜索排名、吸引流量、增加曝光的重要策略。通过优化网站结构、内容和链接等方面&#xff0c;让搜索引擎更好地理解和收录网站内容&#xff0c;从而为网站带来更多有价值的有机…

Cisco 路由器配置管理

大多数网络中断的最常见原因是错误的配置更改。对网络设备配置的每一次更改都伴随着造成网络中断、安全问题甚至性能下降的风险。计划外更改使网络容易受到意外中断的影响。 Network Configuration Manager 网络更改和配置管理 &#xff08;NCCM&#xff09;解决方案&#xff…

「JVM」性能调优工具

「JVM」性能调优工具 一、jcmd1、jcmd 能干嘛&#xff1f;2、与JVM相关的命令3、示例 二、jmap1、jmap有什么用&#xff1f;2、jmap的命令大全3、示例 三、jps1、jps有什么用&#xff1f;2、jps命令以及示例 四、jstat1、jstat有什么用&#xff1f;2、jstat命令以及示例 五、js…

Python(四十五)二层循环中的break和continue

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

剑指Offer-学习计划(四)双指针(下)

剑指 Offer 57. 和为s的两个数字 剑指 Offer 58 - I. 翻转单词顺序 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 题目一&#xff1a;调整数组顺序使奇数位于偶数前面 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数在数组的…

WPF实战学习笔记08-创建数据库

创建数据库 创建文件夹 ./Context 创建文件 ./Context/BaseEnity.cs ./Context/Memo.cs ./Context/MyTodoContext.cs ./Context/Todo.cs ./Context/User.cs 创建数据对象 ./Context/BaseEnity.cs namespace MyToDo.Api.Context {public class BaseEnity{public int Id…

C#之泛型

目录 一、概述 二、C#中的泛型 继续栈的示例 三、泛型类 &#xff08;一&#xff09;声明泛型类 &#xff08;二&#xff09;创建构造类型 &#xff08;三&#xff09;创建变量和实例 &#xff08;四&#xff09;比较泛型和非泛型栈 四、类型参数的约束 &#xff08;一…