C++this指针的用途

this指针的用途:
1.当形参和成员变量同名时,可用this指针来区分。
2.在类的非静态成员函数中返回对象本身,可使用return *this

每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码,那么问题是:
这一块代码是如何区分哪个对象调用自己的呢?

C++通过提供特殊的对象指针,this指针解决上述问题。
在这里插入图片描述
对象p1,p2,p3都要调用这个函数,怎么区分是谁调用的呢?
用this指针解决这个问题

this指针指向被调用的成员函数所属的对象
简单来说,谁调用这个函数,this指针就指向谁。

1.this指针是隐含每一个非静态成员函数内的一种指针。
2.this指针不需要定义,直接使用即可。

1、解决名称冲突:
现在让我们看一下名称冲突问题:

#include <iostream>
using namespace std;class Person {public:Person(int age) {age = age;}int age;};//1.解决名称冲突void test01() {Person p1(18);cout << "p1的年龄为:" << p1.age << endl;}
//2.返回对象本身用*thisint main() {test01();return 0;
}

结果为0,如果你用的编译器是vs,结果应该是乱码,我用的是Dev-C++。

在这里插入图片描述

编译器会认为这3个age是同一个age,跟你这个属性age不是一回事,所以我们从来没有给这个属性age进行赋值操作。

解决方法:
1.成员属性和我们传入的形参名称不要同名。
2.使用this指针。

如何使用this指针呢?
代码如下:

#include <iostream>
using namespace std;class Person {public:Person(int age) {//this指针指向的是被调用成员函数所属对象this->age = age;}int age;};//1.解决名称冲突void test01() {Person p1(18);cout << "p1的年龄为:" << p1.age << endl;}
//2.返回对象本身用*thisint main() {test01();return 0;
}

在这里插入图片描述
此时编译器就这样认为了,所以就解决了这个问题。

2、返回对象本身用*this
首先先看这样一段代码:

#include <iostream>
using namespace std;class Person {public:Person(int age) {this->age = age;}int age;void PersonADDAge(Person &p) {this->age += p.age;}};//1.解决名称冲突//void test01() {
//	Person p1(18);
//	cout << "p1的年龄为:" << p1.age << endl;
//
//}
//2.返回对象本身用*thisvoid test02() {Person p1(10);Person p2(10);p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);cout << "p2的年龄为:" << p2.age << endl;}int main() {
//	test01();test02();return 0;
}

我们的目的是让p2加3次p1的年龄,想要的p2年龄返回结果为40,可编译器报错,这是为什么呢?

在这里插入图片描述
因为我们第一次调用PersonADDAge这个函数后,返回的是void,所以就不能再调用这个PersonADDAge函数了,那如果我们可以让第一次调用这个函数后的返回值仍然是p2,那就可以再次调用这个函数,那我们要如何实现呢?
使用this指针。

代码如下:

#include <iostream>
using namespace std;class Person {public:Person(int age) {this->age = age;}int age;//如果要返回本体,要用引用的方式返回。Person &PersonADDAge(Person &p) {this->age += p.age;//this指向p2的指针,而*this指向的就是p2这个对象本体。return *this;}};//1.解决名称冲突//void test01() {
//	Person p1(18);
//	cout << "p1的年龄为:" << p1.age << endl;
//
//}
//2.返回对象本身用*thisvoid test02() {Person p1(10);Person p2(10);//链式编程思想p2.PersonADDAge(p1).PersonADDAge(p1).PersonADDAge(p1);cout << "p2的年龄为:" << p2.age << endl;}int main() {
//	test01();test02();return 0;
}

此时的结果就是40了。
那为什么要用引用呢?
引用指向本身内存,不用引用就是拷贝了,而拷贝指向另一个内存。

这里返回的不是指针或者引用,因为前面加了,所以返回的是p2本体。*

在这里插入图片描述
这个时候我们把这个引用删除,看看结果又是多少?
结果为:20

为什么呢?
在这里插入图片描述

因为此时返回的是一个拷贝的数据,每一次返回都是一个新的对象。

所以最后就第一次调用对真正的p2产生影响,所以结果为20

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

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

相关文章

【实战 Ids4】小技巧篇:自定义登录页操作

今天的内容很简单&#xff0c;1分钟就能看完&#xff0c;5分钟就能学会&#xff0c;但是却是在我们平时开发中必须要学会的一个小知识点&#xff0c;我就不让大家走弯路了&#xff0c;直接看操作。在平时的IdentityServer4开发中呢&#xff0c;我们都是根据官方的Demo来操作一遍…

mysql_result函数用不了_mysql_result()函数怎么在PHP中使用

mysql_result()函数怎么在PHP中使用发布时间&#xff1a;2020-12-21 16:30:03来源&#xff1a;亿速云阅读&#xff1a;69作者&#xff1a;Leah这篇文章给大家介绍mysql_result()函数怎么在PHP中使用&#xff0c;内容非常详细&#xff0c;感兴趣的小伙伴们可以参考借鉴&#xff…

Asp.Net Core下的开源任务调度平台ScheduleMaster

从何说起2017年初的时候&#xff0c;由于当时项目需要做了一个乞丐版定时调度系统&#xff0c;那时候只在单机上实现了核心的调度功能。做这个玩意之前也调研了社区中开源的解决方案&#xff0c;找了几个实地部署试跑了一下&#xff0c;其实都很不错。但那时候我们有个问题就是…

python如何加密字符串_Python实现对字符串的加密解密方法示例

本文实例讲述了Python实现对字符串的加密解密方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;需求是是要将密码存在数据库里&#xff0c;所以要加密解密是可逆的&#xff0c;在数据库里不要有特殊字符&#xff0c;防止数据库备份和恢复中出错。安装PyCrypto&#…

C++友元

友元的目的就是让一个函数或者类访问另一个类中私有成员 友元的关键字&#xff1a;friend 友元的三种实现&#xff1a; 1.全局函数做友元 2.类做友元 3.成员函数做友元 一.全局函数做友元 #include <iostream> using namespace std; #include <cstring>class Bu…

C#录制视频

这是一个使用C#语言制作的录制框架&#xff0c;支持录制桌面&#xff0c;多屏&#xff0c;声音&#xff0c;摄像头&#xff0c;某个应用程序的界面1.安装使用此框架需要安装扩展包Kogel.Record,可以Nuget上搜索或者使用Nuget命令Install-Package Kogel.Record安装完成包后会出现…

C++加号运算符重载

运算符重载概念&#xff1a; 对已有的运算符重新定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 加号运算符重载&#xff1a; 1.成员函数重载加号&#xff1a; #include <iostream> using namespace std;//加号运算符重载//1.成员函数重载号class …

python编程小案例_用Python3编程写第一个小案例!-Go语言中文社区

用Python3编程第一步&#xff01;今天博主跟大家聊一聊如何使用Python3编程第一步&#xff01;&#xff01;不喜勿喷&#xff0c;如有建议欢迎补充、讨论&#xff01;Come on&#xff01;在前面的几篇文章中我们已经学习了一些Python3 的基本语法知识&#xff0c;我们尝试来写一…

UnitTest in .NET(Part 5)

Photo &#xff1a;UnitTesting文 | Edison Zhou上一篇我们学习了单元测试的核心技术&#xff1a;存根、模拟对象和隔离框架&#xff0c;它们是我们进行高质量单元测试的技术基础。本篇会集中在管理和组织单元测试的技术&#xff0c;以及如何确保在真实项目中进行高质量的单元测…

C++左移运算符重载

作用&#xff1a;可以输出自定义数据类型 代码如下&#xff1a; #include <iostream> using namespace std; //左移运算符重载class Person {public:int m_A;int m_B;};ostream &operator<<(ostream &cout, Person &p) { //本质 operator<<(cou…

java 大小写_java中如何进行大小写字母转换?

展开全部1.创建工程&#xff0c;或使用已有工程&#xff0c;在工程下创建包&#xff0c;包内新建一个类&#xff0c;我e69da5e887aa3231313335323631343130323136353331333365653262命名为Cases类&#xff0c;大家根据自己喜好随便命名&#xff0c;但请保持类名与文件名一致。2…

大量SQL的解决方案——sdmap

大量SQL的解决方案——sdmap最近看到群里面经常讨论大型应用中 SQL的管理办法&#xff0c;有人说用 EF/ EFCore&#xff0c;但很多人不信任它生成 SQL的语句&#xff1b;有人说用 Dapper&#xff0c;但将 SQL写到代码中有些人觉得不合适&#xff1b;有人提出用存储过程&#xf…

C++递增运算符重载

作用&#xff1a;通过重载递增运算符&#xff0c;实现自己定义的数据类型 代码如下&#xff1a; #include <iostream> using namespace std;//重载递增运算符//自定义类型 class MyInteger {friend ostream &operator<<(ostream &cout, MyInteger myint)…

java 最小堆_堆排序 最大堆 最小堆 Java 实现

堆一点疑惑&#xff0c;堆排序是就地排序&#xff0c;所以空间复杂度是 O(1)。但是&#xff0c;比如我有一个数组&#xff0c;建立一个最小堆&#xff0c;然后每次取出最小堆的顶点。建立最小堆需要额外空间&#xff1f;不深究了&#xff0c;归并排序需要额外空间。堆是完全二叉…

过去10年技术人员有哪些状态改变?

现在已经是2020年&#xff0c;我们已经进入了下一个10年&#xff0c;我们都应该回顾、复盘一下过去十年技术的发展&#xff0c;以及未来技术能做什么&#xff1f;如何更好的应用技术&#xff1f;我个人也是一个从事技术10年以上的老兵了&#xff0c;对技术人员来说其实不外乎要…

java解压中文乱码_java使用解压zip文件,文件名乱码解决方案

File outFileDir new File(outDir);if (!outFileDir.exists()) {boolean isMakDir outFileDir.mkdirs();if (isMakDir) {log.info("创建压缩目录成功");}}ZipFile zip new ZipFile(zipFile, "gbk");for (Enumeration enumeration zip.getEntries(); en…

提高文档翻译效率神器:VS Code 插件之 Translator Helper

微软 Docs 网站上线之后&#xff0c;我发现很多中文内容是由机器翻译的&#xff0c;可读性比较差。2017 年开始我参与了中文文档的本地化工作&#xff0c;对机器翻译的文本进行校对。Docs 的内容全部托管在 GitHub 上&#xff0c;参与者可以 fork 仓库后进行修改&#xff0c;然…

C++关系运算符重载

作用&#xff1a;重载关系运算符&#xff0c;可以让两个自定义类型对象进行对比操作 代码如下&#xff1a; #include <iostream> using namespace std; #include <cstring> //重载关系运算符class Person {public:Person(string name, int age) {m_Name name;m_…

java 导入导出 插件_Java最优的Excel导入/导出工具开发,你用过吗?

关注程序员7歌&#xff0c;一起用技术改变世界在我们实际开发中经常会遇到Excel的导入与导出功能&#xff0c;而目前Excel操作工具也是数不甚数啊&#xff0c;但是7歌用过很多&#xff0c;还是觉得最近发现的tool-excel好用&#xff0c;让你实现一语句代码就能完成Excel功能。首…

BeetleX网关自定义请求日志插件

网关转发日志非常有用可以进行数据和行为分析&#xff0c;组件提供一个默认的日志插件&#xff0c;但默认记录的东西比较简单不一定满足业务的需要&#xff1b;其实组件提供信息非常完善足以满足不同情况的需要。在这里介绍一下如何实现一个日志插件来记录自己需要的信息&#…