【C++ | this指针】一文了解C++的this指针

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:

本文未经允许,不得转发!!!

目录

  • 🎄一、为什么需要 this 指针
  • 🎄二、什么是 this 指针
  • 🎄三、使用 this 指针
  • 🎄四、总结


在这里插入图片描述

🎄一、为什么需要 this 指针

用下面这个例子说明一下,为什么需要 this 指针。

我们写一个CDate类,在类里面定义一个成员函数BigYear(),负责比较两个CDate对象,并返回年份较大的对象。

class CDate
{
public:
	const CDate& BigYear(const CDate& date)
	{
		if(date.m_year > m_year)
			return date;	// 参数对象
		else
			return ????;	// 调用对象
	}

private:
	int m_year;
	int m_mon;
	int m_day;
};

上面代码中,BigYear成员函数会出现一个问题,假设我们定义了两个CDate对象date_1date_2,并使用语句date_1.BigYear(date_2);来调用BigYear函数时,我们可以将参数对象(date_2的引用)作为返回值,但调用对象date_1却似乎没有办法返回,因为没有它的引用。

要解决这个问题,就需要使用C++的 this 指针。


在这里插入图片描述

🎄二、什么是 this 指针

this 指针指向用来调用成员函数的对象 ( this 被作为隐藏参数传递给类的成员函数)。

一般来说, 所有的类的成员函数( 包括构造函数和析构函数 ) 都有一个 this 指针。this 指针指向调用对象。如果成员函数需要引用整个调用对象,则可以使用表达式*this

this 指针的值不能被修改,this 指针指向的内容可以被修改,所以,BigYear 的函数头可能是下面代码的样子,只是这个this参数是我们看不见的,但可以直接使用:

const CDate& BigYear(CDate* const this, const CDate& date);

也就是说,在类的所有成员函数,都可以直接使用 this 这个名称,它指向调用该成员函数的对象,下面就使用代码来证明这一点:
1、我们使用this指针完善了 BigYear 成员函数;
2、新增printThisObject成员函数,把调用对象指针作为参数,与tish指针的值一起打印对比,会发现是一样的,说this指针就是指向当前调用对象。
3、返回引用的函数是左值的,意味着这些函数返回的是对象本身而非对象的副本。

// g++ 10_this_Date.cpp
#include <iostream>

using namespace std;

class CDate
{
public:
	CDate(int year, int mon, int day);	// 构造函数声明
	~CDate();							// 析构函数声明

	void show()
	{
		cout << "Date: " << m_year << "." << m_mon << "." << m_day << endl;
	}
	
	const CDate& BigYear(const CDate& date)
	{
		if(date.m_year > m_year)
			return date;
		else
			return (*this);
	}
	
	void printThisObject(const CDate* this_object)
	{
		cout << "this_object=" << this_object << ", this=" << this <<endl;
	}

private:
	int m_year;
	int m_mon;
	int m_day;
};

// 构造函数定义
CDate::CDate(int year, int mon, int day)
{
	m_year = year;
	m_mon = mon;
	m_day = day;
	cout << "Calling Constructor" << ", this=" << this <<endl;
}

// 析构函数定义
CDate::~CDate()
{
	cout << "Calling Destructor" << ", this=" << this <<endl;
}

int main()
{
	CDate date_1(2024,06,05);
	date_1.printThisObject(&date_1);
	
	cout << endl;
	
	CDate date_2(2025,06,05);
	date_2.printThisObject(&date_2);
	
	cout << endl;
	
	date_1.BigYear(date_2);
	
	return 0;
}

运行结果如下:
在这里插入图片描述


在这里插入图片描述

🎄三、使用 this 指针

在C++编程中,this指针在下面几个场景特别有用:

  1. 区分函数参数和数据成员:
    我们之前说明,成员函数参数最好不要跟数据成员名称一致,因为这样无法区分,而this指针可以帮助区分,看下面例子:

    class CDate
    {
    public:
    	CDate(int year, int mon, int day)
    	{
    		// year = year; // 会报错,无法区分成员和参数
    		this->year = year;
    		this->mon = mon;
    		this->day = day;
    	}
    
    private:
    	int year;
    	int mon;
    	int day;
    };
    
  2. 作为函数返回值

    const CDate& BigYear(const CDate& date)
    {
       ...
       return *this;
    }
    CDate* const BigYear()
    {
       ...
       return this;
    }
    
  3. 作为函数实参,这个就不举例的,就是将this*this 传给某个函数使用。

在这里插入图片描述

🎄四、总结

👉本文介绍了C++的this指针,为什么需要this指针,什么是this指针,怎么使用this指针。

this指针是所有类成员函数隐藏的一个函数参数:类名 * const this,不能显示地看到,但可以直接使用。
this指针指向当前成员函数的调用对象。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】详解static和extern关键字

文章目录 1. 前言2. 作用域和生命周期2.1 作用域2.1.1 全局变量和局部变量 2.2 生命周期 3. static关键字3.1 static修饰的局部变量 4. extern关键字5. extern和static关键字的相互作用5.1 static修饰函数 6.总结 1. 前言 可能在你遇到这篇文章之前&#xff0c;你可能并未听过…

IDEA2023.1.4配置springboot项目

新建“Spring Initializr”项目 勾选以下三个依赖项即可。 springboot分为代码层、资源层和测试层。 代码层 根目录&#xff1a;src/main/java 入口启动类及程序的开发目录。在这个目录下进行业务开发、创建实体层、控制器层、数据连接层等。 资源层 根目录&#xff1a;src…

奇迹MU最强法师介绍

1、黑龙波 释放出深渊中的黑龙之魂&#xff0c;对一定范围内的目标造成中等程度伤害。 奥义&#xff1a; 怒哮——法师释放出深渊龙魂的怨怒之力&#xff0c;在电闪雷鸣中中咆哮的龙魂将对敌人额外造成少量伤害。 魂阵——法师利用法阵控制黑龙之魂进行更大范围的攻击&…

史上最强 AI 翻译诞生了!拳打谷歌,脚踢 DeepL

CoT 推理范式 默认情况下&#xff0c;大语言模型通常是直接给出问题的最终答案&#xff0c;中间推理过程是隐含的、不透明的&#xff0c;无法发挥出大模型最极致的理解能力。如果你用它来充当翻译&#xff0c;可能效果和传统的机器翻译也差不了太多。 如果我们给大模型设计一…

天行健咨询 | 谢宁DOE培训的课程内容有哪些?

谢宁DOE培训的课程内容丰富而深入&#xff0c;旨在帮助学员掌握谢宁问题解决方法在质量管理中的重要作用&#xff0c;并学会如何运用这一方法工具&#xff0c;在不中断生产过程的前提下&#xff0c;找出并解决生产中遇到的复杂而顽固的问题。 首先&#xff0c;课程会详细介绍谢…

SpringCloud Hystrix服务熔断实例总结

SpringCloud Hystrix断路器-服务熔断与降级和HystrixDashboard SpringCloud Hystrix服务降级实例总结 本文采用版本为Hoxton.SR1系列&#xff0c;SpringBoot为2.2.2.RELEASE <dependency><groupId>org.springframework.cloud</groupId><artifactId>s…

Kafka之Producer原理

1. 生产者发送消息源码分析 public class SimpleProducer {public static void main(String[] args) {Properties prosnew Properties();pros.put("bootstrap.servers","192.168.8.144:9092,192.168.8.145:9092,192.168.8.146:9092"); // pros.pu…

【必会面试题】ThreadLocal的底层原理及其使用场景

目录 原理应用场景优势1. 避免线程安全问题2. 提高性能3. 简化代码 注意事项权衡决策 ThreadLocal是Java中用于创建线程局部变量的一个类&#xff0c;它提供了一种将变量绑定到当前线程的技术&#xff0c;使得每个线程都拥有该变量的独立副本&#xff0c;即使是在多线程环境下也…

GitHub生成SSH密钥,使用SSH进行连接

目录 一、生成新的SSH密钥 二、添加新的SSH密钥 三、测试SSH连接 四、SSH密钥密码 五、创建新仓库并推送到github 说明 使用 SSH URL 将 git clone、git fetch、git pull 或 git push 执行到远程存储库时&#xff0c; 须在计算机上生成 SSH 密钥对&#xff0c;并将公钥添加到…

keil program algorithm 出错

前段时间 在 调试下载算法时&#xff0c;遇到一个奇怪的问题 就是 加载下载算法后&#xff0c; 下载算法的RAM空间 大小不能修改为 单片机的最大RAM&#xff0c;只能改到最大4KB的空间大小, 再大就报错 刚开始报错 一直不知道原因&#xff0c;走了很多弯路&#xff0c; 到最…

SharePoint:智能内容管理,释放数据价值

在Microsoft 365的庞大生态系统中&#xff0c;SharePoint常常被忽视&#xff0c;但它却是整个平台的核心。SharePoint不仅承载着OneDrive、Teams、Power Platform等所有Microsoft 365产品的内容存储&#xff0c;更是企业协作和内容管理的基石。助AI技术的加持&#xff0c;Share…

Microbiome | binning+转录组→首个草鱼肠道基因集目录发布啦

草鱼便宜又好吃 但是你了解草鱼吗&#xff1f; 草鱼的肠道里定殖着成千上万的共生微生物&#xff0c;它们与草鱼共同生存&#xff0c;相互影响。这些微生物在草鱼的新陈代谢、免疫调节等方面发挥着重要作用。 虽然同为经济作物&#xff0c;鱼类的微生态相关研究远远…

U盘未安全退出后提示格式化:原因分析与数据恢复策略

在日常工作和生活中&#xff0c;U盘作为便携式存储设备的代表&#xff0c;因其小巧、方便携带和存储容量大等特点而广受欢迎。然而&#xff0c;不少用户在使用U盘的过程中都遇到过一个令人头疼的问题&#xff1a;U盘在没有安全退出的情况下被直接拔出&#xff0c;再次插入时系统…

[职场] 研究生面试自我介绍_1 #经验分享#知识分享

研究生面试自我介绍 想要进入职场&#xff0c;面试是必不可少的。然而想要面试成功&#xff0c;就需要一个让人印象深刻的自我介绍&#xff0c;好的自我介绍可以让面试官&#xff0c;快速了解自己&#xff0c;快速记住自己。 一、范文1 我是一名硕士研究生&#xff0c;即将毕业…

SOLIDWORKS认证考试的目的

在当今日益发展的工程设计和制造领域&#xff0c;SOLIDWORKS作为一款功能强大的三维CAD设计软件&#xff0c;已经得到了广泛的认可和应用。为了评估和提升用户在使用SOLIDWORKS软件时的专业技能和能力&#xff0c;SOLIDWORKS公司推出了认证考试项目。本文将深入探讨SOLIDWORKS认…

.net 下的身份认证与授权的实现

背景 任何一个系统&#xff0c;都需要对于底层访问的页面和接口进行安全的处理&#xff0c;其中核心就是认证和授权。 另外一个问题就是在实际编程过程中&#xff0c;我们的代码有不同的模式&#xff0c;不同的分层或者在不同的项目之中&#xff0c;如何在不同的地方取得用户…

ACDSee Photo Studio Ultimate v17 解锁版安装教程 (图片编辑器)

前言 ACDSee Photo Studio Ultimate 2024&#xff0c;一款适合各类摄影师和创意人士的综合解决方案&#xff0c;具备了经过省时的本地人工智能 (AI) 强化的全新特性和改进功能&#xff0c;使您能够以最小的投入获得最大的控制&#xff0c;从而更轻松地管理、检索和编辑您的照片…

免费分享一套SpringBoot+Vue校园论坛(微博)系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue校园论坛(微博)系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue校园论坛(微博)系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue校园论坛(微博)系统 Java毕业设计…

Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。

文章目录 前言一、项目初始化搭建1、创建项目&#xff1a;test_models_django2、创建应用app01 二、配置mysql三、创建model实例&#xff0c;自动创建数据库表1、创建对象User类2、执行命令 四、思考问题&#xff08;****&#xff09;1、是否会生成新表呢&#xff08;答案报错&…

数据结构——哈希表、哈希桶

哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较&#xff0c;顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(logN),搜索的效率取决于搜索过程种元素的比较次…