C++类与对象——this指针

news2024/11/24 4:28:33

文章目录

  • 概述
  • this指针的引出
  • this指针的特性
  • 将this指针用于多个对象的比较
  • this指针可以为空吗?

概述

本篇博客主要讲解C++类和对象模块中的this指针的知识,将会深入探究this指针的使用细节即使用时需要注意的点,并且简单讲解一下底层的实现原理。

this指针的引出

我们首先定义一个日期类data

class Date
{
private:
	int _year;  //年
	int _month; //月
	int _day;   //日
	int a;
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month
		_day = day;
	}
	void print()
	{
		std::cout << _year << "-" << _month << "-" << day << endl;
	}
	Date cp_year(const Date& x)
	{
		//如何将当前类的年份数据和其他类进行比较?
		if(x._year>????)
			reutnr x;
		else
			return ???;
		//???处应该填写什么
	}
};

int main()
{
	Date d1,d2;
	d1.Init(2022,1,2);
	d2.Init(2023,3,24);
	d1.print();
	d2.print();
	return 0;
}

在上面使用日期类的时候,就会有一些问题:

Date类中有InitPrint两个成员函数,函数体中并没有关于不同对象的区分,当d1调用Init函数时,该函数时如何知道应该设置d1对象时,而不是设置d2对象呢?
'cp_year’如果是当前类的年份更大,应该返回什么东西呢?

这里就要用到this指针了,c++通过引入this指针解决这些问题。

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

注意

  1. 编译器同时也静止用户在函数声明中加上该指针,这是语法规定。
    在这里插入图片描述
    像这样,编译器会报错
  2. this指针在运行时会存在于对象内部吗?
    不存在于对象内部,this指针是一个形参,所以this指针是跟普通参数一样存在于函数调用的栈帧里面的。

this指针的特性

  1. this指针的类型: 类类型const指针,例如上面的类其this指针类型为(Date * const this),即成员函数中,不能给this指针赋值。(不能改变this指针的指向)
  2. 只能在成员函数内部使用
  3. this指针本质上是成员函数的形参,当对象调用成员函数时,编译器将隐式地将对象地址作为实参传递给this形参,所以对象中不存储this指针
  4. vs上对this指针的传递做出了优化,由于其经常要使用,vs编译器将this指针通过寄存器自动传递,从而可以提高访问效率,如下图所示:

在这里插入图片描述

另外,通过过this指针的了解,我们可以知道编译器在处理成员函数时会对其加上this指针,例如:

//类成员函数的print()函数将会被编译器隐式处理成如下形式:
void print(Date* const this)
{
	std::cout << this->_year << "-" << this->_month << "-" << this->day << endl;
}
//隐式处理过程用户不可见

//并且调用过程
//d1.print()也相当于隐式地将d1的地址作为实参传递给了this指针
print(&d1);

将this指针用于多个对象的比较

当对this指针有了了解之后,我们就可以涌起去完善刚才无法完成的cp_year函数了,如下:

	Date cp_year(const Date& x)
   {
   	//注意,this是对象的指针,要使用其中的数据需要对其进行解引用操作
   	if (x._year > (*this)._year)
   		return x;
   	else
   		return *this ;
   }
   //接着就可以用这个函数来进行比较年份
   Date old = d1.cp_year(d2);
   old.print();

this指针可以为空吗?

看下面一个代码:

Date* p = nullptr;
p->print();
return 0;

大家可以先想一想,这段代码最后能够正常运行吗?还是会编译报错,又或者是运行时崩溃?


答案是:运行错误

为什么呢?

这是由于编译器并不禁止传递空指针给this形参,但是当print()函数要打印数据时会对this指针解引用(this->_year),而对空指针解引用是会产生错误的,所以会发生运行崩溃。


以上就是关于this指针的全部内容啦!如果小伙伴们有哪里没有理解,或者发现博主的错误以及还有哪里没有写到位的话,欢迎大家在评论区指出!

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

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

相关文章

Maven(五):Maven的使用——依赖的测试

Maven&#xff08;五&#xff09;&#xff1a;Maven的使用——依赖的测试 前言一、实验六&#xff1a;测试依赖的范围1、依赖范围1.1 compile 和 test 对比1.2 compile 和 provided 对比1.3 结论 二、实验七&#xff1a;测试依赖的传递性1、依赖的传递性1.1 概念1.2 传递的原则…

内网渗透之横向移动rdpwinrmwinrsspnkerberos

0x00 准备 环境&#xff1a;god.org cs上线 win2008web 提权利用ms14-058 抓取hash和明文密码(当获取到其他主机就重复提权和抓取密码) 扫描存活主机&#xff0c;扫描端口 代理转发-转发上线&#xff0c;生成反向连接木马&#xff0c;绑定监听器&#xff0c;上传至web根目录(方…

hardhat 本地连接matemask钱包

Hardhat 安装 https://hardhat.org/hardhat-runner/docs/getting-started#quick-start Running a Local Hardhat Network Hardhat greatly simplifies the process of setting up a local network by having an in-built local blockchain which can be easily run through a…

制作一个高质量的FAQ页面需要考虑哪些因素?

作为现代企业不可缺少的知识库&#xff0c;FAQ页面&#xff08;Frequently Asked Questions&#xff09;是集中呈现重要信息供用户查询和解决问题的权威场所。如果您在网站上提供了不错的产品或服务&#xff0c;很多客户都会通过访问FAQ页面找到他们需要的答案。 在设计和创建…

Linux Ansible安装以及环境搭建

Ansible介绍 Ansible是一种基于Python的自动化配置工具&#xff0c;通过OpenSSH的方式管理被管理节点&#xff0c;实现批量系统配置、批量程序部署、批量运行命令等功能。 当管理节点需要管理被管理节点时&#xff0c;只需要在管理节点安装ansible&#xff0c;无需在被管理节…

23种设计模式-代理模式

代理模式 在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 介绍 意图&#xff1a;为其他对象提供…

【KingSCADA】什么是精灵图以及如何创建精灵图

大家好&#xff0c;我是雷工&#xff01; 本篇学习精灵图的制作&#xff0c;以下为学习内容及相关笔记。 一、什么是精灵图 精灵图是一种在外观上类似组合图&#xff0c;但内部嵌入了比较丰富的动画链接与逻辑控制&#xff0c;工程开发人员只要将其从精灵图库中调出来放置在开…

[Netty] Mpsc Queue (十七)

JCTools 是适用于 JVM 并发开发的工具&#xff0c;主要提供了一些 JDK 确实的并发数据结构&#xff0c;例如非阻塞 Map、非阻塞 Queue 等。其中非阻塞队列可以分为四种类型&#xff0c;可以根据不同的场景选择使用。 Spsc 单生产者单消费者Mpsc 多生产者单消费者Spmc 单生产者…

大模型(LLM)训练微调综述学习

总览 介绍大模型训练的微调方法&#xff0c;包括prompt tuning、prefix tuning、LoRA、p-tuning和AdaLoRA等。介绍使用deepspeed和LoRA进行大模型训练的相关代码。给出petals的介绍&#xff0c;它可以将模型划分为多个块&#xff0c;每个用户的机器负责其中一块&#xff0c;分…

PS学习记录-PPI与DPI

先说两者的重点&#xff1a; dpi是印刷图像时候用的&#xff0c;ppi是设计图像时候用的dpi&#xff1a;【点/英寸】 是印刷计量单位&#xff0c;是每英寸上所印刷的【墨点数】&#xff0c;打印图片一般300dpi左右&#xff0c;代表打印的解析度。ppi&#xff1a;【像素/英寸】是…

快速精通Git

一、 版本控制工具 1.1. 什么是版本控制系统&#xff1f; 版本控制系统&#xff08;Version Control System&#xff09;:是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件&#xff0c;而且…

温度调制式差示扫描量热法(MTDSC)中的正弦波温度控制技术

摘要&#xff1a;在调制温度式差式扫描量热仪&#xff08;MTDSC&#xff09;中&#xff0c;关键技术之一是正弦波加热温度的实现&#xff0c;此技术是制约目前国内无法生产MTDSC量热仪的重要障碍&#xff0c;这主要是因为现有的PID温控技术根本无法实现不同幅值和频率正弦波这样…

uie-base使用记录(paddlenlp)

参考文章&#xff1a;https://aistudio.baidu.com/aistudio/modelsdetail?modelId22 参考文章&#xff1a;https://paddlenlp.readthedocs.io/zh/latest/FAQ.html 参考文章&#xff1a;https://developer.aliyun.com/article/1066857 参考文章&#xff1a;https://github.com/…

【计算机基本原理-数据结构】八大数据结构分类

【计算机基本原理-数据结构】八大数据结构分类 1&#xff09;数组2&#xff09;链表3&#xff09;队列4&#xff09;栈5&#xff09;树6&#xff09;图7&#xff09;堆8&#xff09;散列表(哈希表) 数据结构是计算机存储、组织数据的方式。一种好的数据结构可以带来更高的运行或…

Java基础(十三)系统相关类

1. 系统相关类 1.1 java.lang.System类 System类代表系统&#xff0c;系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。 由于该类的构造器是private的&#xff0c;所以无法创建该类的对象。其内部的成员变量和成员方法都是static的&#xff0c;所以也可…

Netty(一)深入Hotspot源码与Linux内核理解NIO与Epoll

深入Hotspot源码与Linux内核理解NIO与Epoll 前言介绍Netty 的介绍Netty 的应用场景理解阻塞和同步关键字初始BIO、NIO、AIOBIO(Blocking IO)缺点&#xff1a;应用场景&#xff1a; NIO(Non Blocking IO)应用场景&#xff1a;NIO非阻塞代码示例存在的问题 NIO 有三大核心组件&am…

Mybatis学习基础篇(一)——使用Maven快速搭建一个mybatis项目,并实现简单的增删改查

题外话&#xff1a; 在了解mybatis框架之前&#xff0c;我先说明一句&#xff0c;目前主流的框架技术层出不穷&#xff0c;每个人都有自己喜欢的技术框架&#xff0c;自己喜欢用就行。技术并没有高低之分&#xff0c;喜欢用就用&#xff0c;虽然目前大部分人都喜欢向新技术看齐…

flex布局下两端对齐,不满左对齐

文章目录 解决方案一 (利用父级的 :after 占位)解决方案二(利用:last-child和:nth-child()占位)解决方案三(补位添加节点法&#xff0c;这种方案适用于多种排列方式) 问题情境&#xff1a; 在flex布局下&#xff0c;多行排列&#xff0c;如何让flex布局最后一行没有排满时&…

如何构建适合自己的DevOps软件测试改进方案

根据2022年的DevOps全球调查报告显示&#xff0c;主流软件企业采用或部分采用DevOps且已获得良好成效的占比已达70%&#xff0c;DevOps俨然成为当下软件开发研究的重要方向。 测试作为软件开发的必要过程&#xff0c;是提升软件可靠性、保证软件质量的关键环节。然而&#xff…

上海亚商投顾:沪指失守3300点 传媒、游戏板块逆市大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日继续调整&#xff0c;沪指午后跌超1%&#xff0c;失守3300点整数关口&#xff0c;创业板指一度跌逾2%…