C++学习Day04之this指针

目录

  • 一、程序及输出
    • 1.1 基础使用
    • 1.2 *this和链式编程
    • 1.2.1 返回引用进行链式编程
    • 1.2.2 返回值进行链式编程
    • 1.3 注意事项
  • 二、分析与总结


一、程序及输出

在 C++ 中使用类的成员函数时,可以使用 this 指针来引用当前对象的地址。this 指针是一个隐式参数,它指向当前对象本身。

1.1 基础使用

#include<iostream>
using namespace std;class Person
{
public:Person(int age){//用途1 :解决名称冲突this->age = age;}Person(const Person& p) {cout << "重写拷贝构造函数" << endl;}//this指针 隐式加在每个成员函数中bool compareAge(Person &p){if (this->age == p.age){return true;}return false;}int age;
};
void test01()
{//this指针 指向 被调用的成员函数 所属的对象Person p1(10);cout << "p1的年龄为: " << p1.age << endl;Person p2(10);bool ret = p1.compareAge(p2);if (ret){cout << "p1与p2年龄相等" << endl;}
}
int main(){test01();system("pause");return EXIT_SUCCESS;
}

输出:
在这里插入图片描述

在类的成员函数中,可以使用 this 指针来访问当前对象的成员变量和成员函数。
通过 this 指针,可以避免与局部变量或参数同名的成员变量发生歧义。

1.2 *this和链式编程

*表示的解引用,那么*this就很好理解了,就是指针的内容,即对象本身。

1.2.1 返回引用进行链式编程

#include<iostream>
using namespace std;class Person
{
public:Person(int age){//用途1 :解决名称冲突this->age = age;}Person(const Person& p) {cout << "重写拷贝构造函数" << endl;}Person&  personAddPerson(Person &p)   //返回值和返回引用的区别:返回值会调用拷贝构造函数创建新的本体{this->age += p.age;return *this; //*this 就是本体}int age;
};
void test01()
{//this指针 指向 被调用的成员函数 所属的对象Person p1(10);cout << "p1的年龄为: " << p1.age << endl;Person p2(10);p1.personAddPerson(p2).personAddPerson(p2).personAddPerson(p2); //链式编程cout << "p1的年龄为: " << p1.age << endl;
}
int main(){test01();system("pause");return EXIT_SUCCESS;
}

输出:
在这里插入图片描述

1.2.2 返回值进行链式编程

上述程序不变,只修改函数返回类型

......Person  personAddPerson(Person &p)   //返回值和返回引用的区别:返回值会调用拷贝构造函数创建新的本体{this->age += p.age;return *this; //*this 就是本体}
......

输出:
在这里插入图片描述
分析:

返回值会调用拷贝构造函数创建新的本体,第一次函数调用时,p1的age添加了10,等于20,之后返回创建了新的Person实体,然后循环调用函数,都不再是对p1的操作了…

1.3 注意事项

在静态成员函数中,不能使用 this 指针,因为静态成员函数是与类关联,而不是与对象关联的。

在全局函数或非成员函数中,也不能使用 this 指针,因为这些函数不属于任何特定的对象。


二、分析与总结

作用
this 指针用于在类的成员函数中引用当前对象,以访问对象的成员变量和成员函数。
类型
this 指针的类型是指向当前类对象的指针。如果类是 const 类型的,则 this 指针的类型是指向 const 类型对象的指针。
避免歧义
使用 this 指针可以避免成员变量和局部变量同名时的歧义,确保正确引用类的成员变量。
返回当前对象的引用
在成员函数中,可以使用 return *this 来返回当前对象的引用,以支持链式调用。
构造函数和析构函数中的使用
在构造函数中,可以使用 this 指针来初始化成员变量或调用其他成员函数。
在析构函数中,可以使用 this 指针来执行必要的清理操作。
限制
在静态成员函数中,不能使用 this 指针,因为静态成员函数是与类关联,而不是与对象关联的。
在全局函数或非成员函数中,也不能使用 this 指针,因为这些函数不属于任何特定的对象。

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

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

相关文章

macbookpro和macbookair的区别?cleanmymac 怎么清理mac空间

苹果mac air和pro区别有&#xff1a;1、air采用了轻薄的设计&#xff0c;重量相对较轻&#xff0c;便于携带&#xff0c;而pro更加注重性能&#xff0c;所以比较重&#xff1b;2、air通常搭载较低功耗的处理器内存和存储容量相对较小&#xff0c;而pro配备了更强大的处理器、更…

[LibreOJ]#6279. 数列分块入门 3

原题地址&#xff1a; https://loj.ac/p/6279https://loj.ac/p/6279 题目描述 给出一个长为 n 的数列&#xff0c;以及 n 个操作&#xff0c;操作涉及区间加法&#xff0c;询问区间内小于某个值 x 的前驱&#xff08;比其小的最大元素&#xff09;。 输入格式 第一行输入…

【Java程序设计】【C00246】基于Springboot的留守儿童爱心网站(有论文)

基于Springboot的留守儿童爱心网站&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的留守儿童爱心网站 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;系统首页的主要功能展…

Python初学者学习记录——python基础综合案例:数据可视化——动态柱状图

一、案例效果 通过pyecharts可以实现数据的动态显示&#xff0c;直观的感受1960~2019年世界各国GDP的变化趋势 二、通过Bar构建基础柱状图 反转x轴和y轴 标签数值在右侧 from pyecharts.charts import Bar from pyecharts.options import LabelOpts# 构建柱状图对象 bar Bar()…

用通俗易懂的方式讲解:在企业算法项目落地中,大模型能力增强最常用的两种方式

如何对 LLM 大模型增强&#xff1f; 对 LLM 大模型能力增强在企业有两种实践路线&#xff1a;RAG 和 Fine-tuning。接下来我们详细剖析下这两种增强实现方式。 第一&#xff1a;检索增强生成 RAG&#xff08;Retrieval Augmented Generation&#xff09;实现方式 2020 年&am…

MongoDB从入门到实战之Docker快速安装MongoDB

前言 在上一篇文章中带领带同学们快速入门MongoDB这个文档型的NoSQL数据库&#xff0c;让大家快速的了解了MongoDB的基本概念。这一章开始我们就开始实战篇教程&#xff0c;为了快速把MongoDB使用起来我将会把MongoDB在Docker容器中安装起来作为开发环境使用。然后我这边MongoD…

前端工程化之:webpack3-5(css module)

目录 一、css module 1.思路 2.实现原理 3.如何应用样式 4.其他操作 &#xff08;1&#xff09;全局类名 &#xff08;2&#xff09;如何控制最终的类名 5.其他注意事项 一、css module 通过命名规范来限制类名太过死板&#xff0c;而 css in js 虽然足够灵活&…

ShardingSphere 5.x 系列【6】YAML 配置介绍

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 前言2. YamlConfiguration3. 常用配置项3.1 JDBC 驱动3.2 数据源3.3 规则…

【Python】Mac 本地部署 stable-diffusion

其实要在本地部署 stable-diffusion 不难&#xff0c;只要有“魔法”一切都水到渠成&#xff0c;如下图&#xff1a; (base) MacBook-Pro python % git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui Cloning into stable-diffusion-webui... remote: Enu…

Mac 下JDK环境变量配置 及 JDK多版本切换

一、推荐官网下载&#xff1a; 二、环境变量配置 1、查看JDK地址&#xff0c;在终端输入以下命令&#xff1a; /usr/libexec/java_home -V 我的路径&#xff1a; /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home /Library/Java/JavaVirtualMachines/zulu-11.j…

鸿蒙开发系列教程(十二)--布局应用:Flex布局

相关属性参数与css3的flex布局参数相似 排列方向&#xff1a;direction: FlexDirection.Row, 换行&#xff1a;wrap: FlexWrap.NoWrap, 水平垂直对齐方式&#xff1a; justifyContent: FlexAlign. SpaceBetween, alignItems: ItemAlign.Center Entry Component struct Flex…

Redis核心技术与实战【学习笔记】 - 21.Redis实现分布式锁

概述 在《20.Redis原子操作》我们提到了应对并发问题时&#xff0c;除了原子操作&#xff0c;还可以通过加锁的方式&#xff0c;来控制并发写操作对共享数据的修改&#xff0c;从而保证数据的正确性。 但是&#xff0c;Redis 属于分布式系统&#xff0c;当有多个客户端需要争…