解剖this指针

目录

this指针的理解

 1. this指针的用处

 2.this指针的使用

3.this指针的使用

this指针来源


this指针的理解

     通常在class定义时要用到类型变量自身时,因为这时候还不知道变量名(为了通用也不可能固定实际的变量名),就用this这样的指针来使用变量自身。 

 1. this指针的用处

        一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。

        this作用域是在类内部当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

        在成员函数内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用。

        this的目的总是指向这个对象,所以this是一个常量指针,我们不允许改变this中保存的地址

 2.this指针的使用

        一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时,如this->n = n (不能写成n = n)。

3.this指针的使用

this指针是存在与类的成员函数中,指向被调用函数所在的类实例的地址。

以下程序来说明this指针

#include<iostream.h>
class Point
{ int x, y;
public:Point(int a, int b) { x=a; y=b;}Void MovePoint( int a, int b){ x+=a; y+=b;}Void print(){ cout<<"x="<<x<<"y="<<y<<endl;}
};
void main( )
{Point point1( 10,10);point1.MovePoint(2,2);point1.print( );
}

当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。

MovePoint函数的原型应该是 void MovePoint ( Point* this, int a,int b);第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见时因为这个参数在类中的隐含的。这样point1的地址就传递给了this,所以在MovePoint函数中便显示的写成:

              void MovePonit(int a ,int b) { this->x += a; this->y += b;}

即可以知道,point1调用该函数后,也就是point1的数据成员被调用并更新了值。即该函数过程可改写成 point.x += a; point1.y += b;

4.关于this指针的一个经典回答:

当你进入一个房子后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。

对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身。

C++类中this指针的理解_c++的类中,this的变量类型是什么-CSDN博客

this指针来源

一个学生可以有多本书一样,而这些书都是属于这个同学的;同理,如果有很多个同学在一起,那么为了确定他们的书不要拿混淆了,最好的办法我想应该就是每个同学都在自己的书上写上名字,这样肯定就不会拿错了。

      同理,一个对象的多个成员就可看作是这个对象所拥有的书;而在很多个对象中间,我们为了证明某个成员是自己的成员,而不是其他对象的成员,我们同样需要给这些成员取上名字。在C++中,我们利用this指针帮助对象做到这一点,this指针记录每个对象的内存地址,然后通过运算符->访问该对象的成员。


class A
{
public:int get() const { return i; }void set(int x) { this->i = x; cout << "this指针保存的内存地址为:" << this << endl; }
private:int i;
};int main()
{A a;a.set(9);cout << "对象a所在的内存地址为:" << &a << endl;cout << "对象a所保存的值为:" << a.get() << endl;cout << endl;A b;b.set(999);cout << "对象b所在的内存地址为:" << &b << endl;cout << "对象b所保存的值为:" << b.get() << endl;return 0;
}

通过这个输出结果,我们可以看到,对象a的内存地址和this指针的一模一样;而当运行到对象b的时候,它的内存地址又和它所对应的this指针指向的内存地址一模一样了。

这就说明了this指针变量记录的是当前对象的内存地址,即this指针指向当前的对象!

通过上面这个例子,我们可以看到this指针最大的作用就是它保存了当前对象的地址,并且应用指针的形式指向了当前的对象。

this指针基础介绍 - uniqueliu - 博客园

本集完

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

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

相关文章

在 CentOS 上安装 Docker 和 Docker Compose

在 CentOS 上安装 Docker 和 Docker Compose 的步骤如下&#xff1a; 首先&#xff0c;安装 Docker&#xff1a; 卸载旧版本的 Docker&#xff1a; sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker…

Java面试 Day03

接口和抽象类有什么区别static和final有什么区别JVM加载类如何索引优化MySQL采用什么结构存储索引 为什么搜索算法有了解吗线程同步的几个方案&#xff0c;以及原理final关键词JVM调优&#xff0c;OOM经历隔离级别&#xff0c;InnoDB中几个隔离级别的原理Linux常用命令Redis可靠…

windows网络驱动开发

基石&#xff1a;WFP 1、简介 Windows过滤平台&#xff08;Windows Filtering Platform, WFP&#xff09;&#xff0c;是从Vista系统后新增的一套系统API和服务。开发者可以在WFP框架已划分的不同分层中进行过滤、重定向、修改网络数据包&#xff0c;以实现防火墙、入侵检测系…

电机控制器电路板布局布线参考指导(五)

电机控制器电路板布局布线参考指导&#xff08;五&#xff09;大容量电容和旁路电容的放置 1.大容量电容的放置2.电荷泵电容器3.旁路电容/去耦电容的放置3.1 靠近电源3.2 靠近功率器件3.3 靠近开关电流源3.4 靠近电流感测放大器3.5 靠近稳压器 tips&#xff1a;资料主要来自网络…

Java旅行商问题知识点(含面试大厂题和源码)

旅行商问题&#xff08;Travelling Salesman Problem&#xff0c;简称TSP&#xff09;是组合优化中的一个经典问题。问题的目标是找到最短可能的路径&#xff0c;让旅行商从一个城市出发&#xff0c;经过所有其他城市恰好一次&#xff0c;然后回到起始城市。 TSP是一个NP-hard…

Modality-Aware Contrastive Instance Learning with Self-Distillation ... 论文阅读

Modality-Aware Contrastive Instance Learning with Self-Distillation for Weakly-Supervised Audio-Visual Violence Detection 论文阅读 ABSTRACT1 INTRODUCTION2 RELATEDWORKS2.1 Weakly-Supervised Violence Detection2.2 Contrastive Learning2.3 Cross-Modality Knowle…

读天才与算法:人脑与AI的数学思维笔记02_激发创造力

1. 心理创造力 1.1. 自我创造力的实现结果对个体来说可能是全新的&#xff0c;但纵观历史其实已算是“明日黄花”&#xff0c;这就是心理创造力的概念 2. 激发创造力 2.1. 理智是创造力最大的敌人 2.1.1. 巴勃罗毕加索&#xff08;P…

Jmeter 场景测试:登录--上传--下载--登出

为了练习Jmeter的使用&#xff0c;今天我要测试的场景是“登录--上传--下载--登出”这样一个过程. 测试的目标是我曾经练手写的一个文件分享系统&#xff0c;它要求用户只有登录后才可以下载想要的文件。 Jmeter总体结构&#xff1a; 第一步&#xff1a;添加HTTP Cookie管理器…

47.HarmonyOS鸿蒙系统 App(ArkUI)创建轮播效果

创建轮播效果&#xff0c;共3页切换 Entry Component struct Index {State message: string Hello Worldprivate swiperController: SwiperController new SwiperController()build() {Swiper(this.swiperController) {Text("第一页").width(90%).height(100%).bac…

电动汽车退役锂电池SOC主动均衡控制MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 仿真简介 模型选用双向反激变换器作为主动均衡拓扑电路&#xff0c;均衡策略采用基于SOC的主动均衡策略&#xff0c;旨在解决电动汽车退役锂电池的不一致性问题。模型选用双向反激变换器作为主动均衡拓扑电路…

pytorch Neural Networks学习笔记

&#xff08;1&#xff09;输入图像&#xff0c;13232&#xff0c;通道数1&#xff0c;高32&#xff0c;宽32 &#xff08;2&#xff09;卷积层1&#xff0c;滤波器的shape为6155&#xff0c;滤波器个数6&#xff0c;通道数1&#xff0c;高5&#xff0c;宽5。卷积层1的输出为62…

【介绍下负载均衡原理及算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

使用docker配置DSP-SLAM

一.Docker环境配置 1.简单介绍 –docker容器技术–。 简单理解&#xff1a;Anaconda用于隔离不同的python环境&#xff1b;docker可以理解成在你的机器里面安装了一个独立的系统&#xff0c;因此它可以隔离不同的CUDA环境&#xff0c;还有着独立的文件系统&#xff0c;防止别…

BERT 微调中文 NER 模型

查看GPU数量和型号 import torch# 检查CUDA是否可用 if torch.cuda.is_available():print("CUDA is available!")# 还可以获取CUDA设备的数量device_count torch.cuda.device_count()print(f"Number of CUDA devices: {device_count}")# 获取第一块GPU的…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用HDR功能(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用HDR功能&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机通过NEOSDK进行图像压缩的技术背景代码分析第一步&#xff1a;先引用合适的类文件第二步&#xff1a;通过NEOAPI SDK使用HDR高动态范围功能第二步&#xff1a…

设计模式学习(五)——《大话设计模式》

文章目录 设计模式学习&#xff08;五&#xff09;——《大话设计模式》UML类图主要组成元素绘制UML类图的步骤如何绘制好&#xff35;&#xff2d;&#xff2c;类图确定类定义关系使用标准符号添加注释工具选择复审与优化求反馈 UML类图和设计模式的关系根据设计模式绘制UML类…

计算机网络----由概述到ICMP

麻烦先把五个层次刻进DNA里面 应用层 传输层 网络层 数据链路层 物理层 网络层和传输层的区别 网络层:设备到设备 传输层:端口到端口&#xff0c;进程到进程 物理层: 考虑的是怎样才能在连接计算机的传输媒体上传输比特流&#xff0c; 主要考虑的是屏蔽掉不同传输媒体和通信手段…

高级IO和5种IO模型

目录 1. 高级IO1.1 IO的基本概念1.2 OS如何得知外设当中有数据可读取1.3 OS如何处理从网卡中读取到的数据包1.4 IO的步骤 2. 五种IO模型2.1 利用钓鱼来理解2.2 阻塞IO2.3 非阻塞IO2.4 信号驱动IO2.5 IO多路转接2.6 异步IO 3. 高级IO的概念3.1 同步通信 VS 异步通信3.2 阻塞 VS …

k-means聚类算法的MATLAB实现及可视化

K-means算法是一种无监督学习算法&#xff0c;主要用于数据聚类。其工作原理基于迭代优化&#xff0c;将数据点划分为K个集群&#xff0c;使得每个数据点都属于最近的集群&#xff0c;并且每个集群的中心&#xff08;质心&#xff09;是所有属于该集群的数据点的平均值。以下是…

数据仓库元数据管理

数据仓库元数据管理是数据仓库中至关重要的一环&#xff0c;它涉及到对数据仓库中的元数据进行收集、存储、组织、查询、维护和安全管理等方面的工作。本文将介绍数据仓库元数据管理的定义、分类、应用、价值、管理方案、具体实施和挑战&#xff0c;以帮助读者更好地理解和应用…