当前位置: 首页 > news >正文

C++ this指针详解

this 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。

所谓当前对象,是指正在使用的对象。例如对于stu.show();,stu 就是当前对象,this 就指向 stu。

下面是使用 this 的一个完整示例:

#include<iostream>
usingnamespace std;class Student{
public:
voidsetname(char*name);
voidsetage(int age);
voidsetscore(float score);
voidshow();
private:
char*name;
int age;
float score;
};void Student::setname(char*name){
this->name = name;
}
void Student::setage(int age){
this->age = age;
}
void Student::setscore(float score){
this->score = score;
}
void Student::show(){cout<<this->name<<"的年龄是"<<this->age<<",成绩是"<<this->score<<endl;
}intmain(){
Student *pstu =new Student;pstu ->setname("李华");pstu ->setage(16);pstu ->setscore(96.5);pstu ->show();return0;
}

运行结果:

李华的年龄是16,成绩是96.5

this 只能用在类的内部,通过 this 可以访问类的所有成员,包括 private、protected、public 属性的。

本例中成员函数的参数和成员变量重名,只能通过 this 区分。以成员函数setname(char *name)为例,它的形参是name,和成员变量name重名,如果写作name = name;这样的语句,就是给形参name赋值,而不是给成员变量name赋值。而写作this -> name = name;后,=左边的name就是成员变量,右边的name就是形参,一目了然。

注意,this 是一个指针,要用->来访问成员变量或成员函数。

this 虽然用在类的内部,但是只有在对象被创建以后才会给 this 赋值,并且这个赋值的过程是编译器自动完成的,不需要用户干预,用户也不能显式地给 this 赋值。本例中,this 的值和 pstu 的值是相同的。

我们不妨来证明一下,给 Student 类添加一个成员函数printThis(),专门用来输出 this 的值,如下所示:

void Student::printThis(){cout<<this<<endl;
}

然后在 main() 函数中创建对象并调用 printThis():

Student *pstu1 =new Student;
pstu1 ->printThis();
cout<<pstu1<<endl;Student *pstu2 =new Student;
pstu2 ->printThis();
cout<<pstu2<<endl;

运行结果:

0x7b17d8

0x7b17d8

0x7b17f0

0x7b17f0

可以发现,this 确实指向了当前对象,而且对于不同的对象,this 的值也不一样。

几点注意:

  • this 是 const 指针,它的值是不能被修改的,一切企图修改该指针的操作,如赋值、递增、递减等都是不允许的。

  • this 只能在成员函数内部使用,用在其他地方没有意义,也是非法的。

  • 只有当对象被创建后 this 才有意义,因此不能在 static 成员函数中使用(后续会讲到 static 成员)。

this 到底是什么

this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。

this 作为隐式形参,本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给 this 赋值。

成员函数最终被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以编译时要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数和成员变量。这个额外的参数,实际上就是 this,它是成员函数和成员变量关联的桥梁。

相关文章:

C++ this指针详解

this 是 C 中的一个关键字&#xff0c;也是一个 const 指针&#xff0c;它指向当前对象&#xff0c;通过它可以访问当前对象的所有成员。所谓当前对象&#xff0c;是指正在使用的对象。例如对于stu.show();&#xff0c;stu 就是当前对象&#xff0c;this 就指向 stu。下面是使用…...

CSS 实现六边形柱状图

前言 &#x1f44f;CSS 实现六边形柱状图 速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 定义全局css变量&#xff0c;柱状宽度为–w&#xff0c;最大高度为–h&#xff0c;柱形整体为渐变色&#xff0c;定义上部分颜色为…...

什么是推挽输出,开漏输出?

这篇文章是看B站“工科男孙老师”这个视频的笔记推挽 开漏 高阻 这都是谁想出来的词&#xff1f;&#xff1f; 我觉得讲的很好&#xff0c;做一下笔记 1.什么是IO输出三态 一共有&#xff1a;高电平, 低电平&#xff0c;浮空/高阻态 三种IO态 2.推挽输出 推挽输出能够表示高、…...

【图像分割】Unet系列深度讲解(FCN、UNET、UNET++)

【图像分割】Unet 深度讲解 文章目录【图像分割】Unet 深度讲解1. 介绍1.1 背景介绍&#xff1a;1.2 医学图像特点1.3 图像分割是什么2. Unet发展历程&#xff08;FCN、Unet、Unet&#xff09;2.1 全卷积网络-FCN2.1.1 FCN介绍&#xff1a;2.1.2 FCN框架2.1.3 反卷积层2.1.4 输…...

list底层的简单实现(万字长文详解!)

list底层的简单实现 文章目录list底层的简单实现list_node的实现&#xff01;list_node的构造函数list的迭代器&#xff01;——重点&#xff01;list迭代器的成员变量迭代器的构造函数* 重载前置 重载后置 重载前置-- 重载后置-- 重载! 重载 重载-- 重载list的const迭代器——…...

学习Linux只要学会这个命令就够了!

大家好&#xff0c;我是良许。 这段时间又是搬家&#xff0c;又是找新办公室&#xff0c;现在终于安顿下来了&#xff0c;有时间给大家分享干货了。 今天给大家介绍一个 Linux 超级实用命令&#xff0c;有了这个命令&#xff0c;你就可以愉快使用 Linux 上几乎所有常用命令了…...

javascript基础

javascript基础 1概述&#xff1a; JavaScript是目前web开发中不可缺少的脚本语言&#xff0c;js不需要编译即可运行&#xff0c;运行在客户端&#xff0c;需要通过浏览器来解析执行JavaScript代码。 诞生于1995年&#xff0c;当时的主要目的是验证表单的数据是否合法。 JavaS…...

【游戏逆向】某游戏技能库分析

技能库的分析大多是从技能名字入手的&#xff0c;然后再通过传入职业或者ID等信息去到库中去取当前角色的可用技能。下面我们来对《**明月刀》中的技能库进行分析。 首先通过CE对技能名字进行搜索&#xff0c;得到较少的结果&#xff0c;分别对结果进行修改&#xff0c;并再次…...

Pytorch深度学习常用预训练网络模型的下载地址

Resnet:model_urls {‘resnet18’: ‘https://download.pytorch.org/models/resnet18-5c106cde.pth‘,‘resnet34’: ‘https://download.pytorch.org/models/resnet34-333f7ec4.pth‘,‘resnet50’: ‘https://download.pytorch.org/models/resnet50-19c8e357.pth‘,‘resnet…...

毕业设计 基于51单片机自动智能浇花系统设计

基于51单片机自动智能浇花系统设计1、毕业设计选题原则说明&#xff08;重点&#xff09;2、项目资料2.1 系统框架2.2 系统功能3、部分电路设计3.1 STC89C52单片机最小系统电路设计3.2 按键电路设计3.3 水泵控制电路设计4、部分代码展示4.1 数码管位选程序4.2 ad0832数据读取程…...

熟悉常用的 Linux 操作和 Hadoop 操作

文章目录前言一、常用命令集合1、cd命令&#xff1a;切换目录1、切换到目录/usr/local2、切换回上级目录3、切换到当前登录Linux系统的用户的自己的文件夹2、ls命令&#xff1a;查看文件与目录3、mkdir命令&#xff1a;创建目录4、rmdir命令&#xff1a;删除空的目录5、cp 命令…...

Vue2项目总结-电商后台管理系统

Vue2项目总结-电商后台管理系统 去年做的项目&#xff0c;拖了很久&#xff0c;总算是打起精力去做这个项目的总结&#xff0c;并对Vue2的相关知识进行回顾与复习 各个功能模块如果有过多重复冗杂的部分&#xff0c;将会抽取部分值得记录复习的地方进行记录 一&#xff1a;项目…...

【二】一起算法---队列:STL queue、手写循环队列、双端队列和单调队列、优先队列

纸上得来终觉浅&#xff0c;绝知此事要躬行。大家好&#xff01;我是霜淮子&#xff0c;欢迎订阅我的专栏《算法系列》。 学习经典算法和经典代码&#xff0c;建立算法思维&#xff1b;大量编码让代码成为我们大脑的一部分。 ⭐️已更系列 1、基础数据结构 1.1、链表➡传送门 1…...

<Linux>环境变量

环境变量 文章目录环境变量一、基本概念二、常见环境变量三、查看环境变量的方法四、测试PATH五、测试HOME六、测试SHELL七、环境变量相关的命令八、环境变量的组织方式九、命令行参数十、通过代码获得环境变量十一、通过系统调用获取环境变量十二、环境变量通常是具有全局属性…...

【MySQL】下载(超详细教程)

目录 First-下载 Second-安装 Third-检测是否安装 Last-总结 First-下载 首先 &#xff0c;我们一步一步跟着我的操作来&#xff0c;不能越步骤&#xff0c;很容易报错&#xff0c;就芭比Q了。 第一步直接进入这个网址&#xff1a;MySQL &#xff1a;&#xff1a; MySQL 社…...

再探pytorch的Dataset和DataLoader

本文从分类、检测、分割三大任务的角度来剖析pytorch得dataset和dataloader源码&#xff0c;可以让初学者深刻理解每个参数的由来和使用&#xff0c;并轻松自定义dataset。思考&#xff1a;在探究Dataset和DataLoader之前&#xff0c;需要明白一个事情&#xff0c;就是当我们不…...

【2023.3.18 美团校招】

文章目录1. 小美剪彩带2. 最多修改两个字符&#xff0c;生成字典序最小的回文串1. 小美剪彩带 题意&#xff1a;找出区间内不超过k种数字子数组的最大长度 使用双指针的方式&#xff0c;用哈希表来统计每个数出现次数。在双指针移动的过程中&#xff0c;动态的维护区间内不同数…...

程序员必须知道的HTML常用代码有哪些?

HTML 即超文本标记语言&#xff0c;是目前应用最为广泛的语言之一&#xff0c;是组成一个网页的主要语言。在现今这个 HTML5 华丽丽地占领了整个互联网的时候&#xff0c;如果想要通过网页抓住浏览者的眼球光靠因循守旧是不行的&#xff0c;程序猿们需要掌握一些必须知道的 HTM…...

多目标家庭行为检测--人脸识别模块构建

文章目录前言原理项目结构编码配置主控函数人脸采集模块特征提取识别测试前言 2023-3-18 天小雨&#xff0c;午觉舒适程度5颗星。任务完成指数2颗星。续接上文&#xff1a;《MidiaPipe stgcn&#xff08;时空图卷积网络&#xff09;实现人体姿态判断&#xff08;单目标&#x…...

RocketMQ重复消费问题的原因

文章目录 概览消息发送异常时重复发送消费消息抛出异常消费者提交offset失败服务端持久化offset失败主从同步offset失败重平衡清理长时间消费的消息总结概览 消息发送异常时重复发送 首先,我们来瞅瞅RocketMQ发送消息和消费消息的基本原理。 如图,简单说一下上图中的概念: …...

WaveTools鸣潮工具箱实战指南:从画质优化到抽卡策略的新视角

WaveTools鸣潮工具箱实战指南&#xff1a;从画质优化到抽卡策略的新视角 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 当我在宿舍用老旧笔记本玩《鸣潮》时&#xff0c;画面卡顿得连技能都放不连贯&…...

别再让LVGL卡顿了!手把手教你用思澈SDK的menuconfig优化framebuffer配置,帧率翻倍

别再让LVGL卡顿了&#xff01;手把手教你用思澈SDK的menuconfig优化framebuffer配置&#xff0c;帧率翻倍 嵌入式UI开发中&#xff0c;LVGL的流畅度直接影响用户体验。许多开发者在使用思澈SDK时&#xff0c;常遇到界面卡顿、帧率低的问题。本文将深入分析framebuffer配置对性能…...

tcc-g15:硬件级散热控制的开源替代方案 | 轻量无广告设计

tcc-g15&#xff1a;硬件级散热控制的开源替代方案 | 轻量无广告设计 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 tcc-g15作为Dell G15系列游戏本的开源替代…...

告别环境混乱:Python3.9镜像实战教程,独立环境管理如此简单

告别环境混乱&#xff1a;Python3.9镜像实战教程&#xff0c;独立环境管理如此简单 1. 为什么需要Python3.9镜像 在Python开发中&#xff0c;最令人头疼的问题莫过于环境冲突。想象一下这样的场景&#xff1a;你正在开发一个需要TensorFlow 2.4的项目&#xff0c;但同时还要维…...

从Kaggle竞赛到真实业务:聊聊那些年我们用错的AI算法和开源库

从Kaggle竞赛到真实业务&#xff1a;聊聊那些年我们用错的AI算法和开源库 在数据科学社区里&#xff0c;Kaggle竞赛排行榜和真实业务需求之间&#xff0c;似乎永远隔着一道看不见的鸿沟。那些在竞赛中斩获高分的神奇模型&#xff0c;一旦放进生产环境&#xff0c;常常表现得像…...

3步精通Calibre电子书转换:从格式兼容到专业排版指南

3步精通Calibre电子书转换&#xff1a;从格式兼容到专业排版指南 【免费下载链接】calibre The official source code repository for the calibre ebook manager 项目地址: https://gitcode.com/GitHub_Trending/ca/calibre 在数字阅读时代&#xff0c;电子书格式碎片化…...

Linux 内核中的调试技术进阶:从 ftrace 到 BPF

Linux 内核中的调试技术进阶&#xff1a;从 ftrace 到 BPF 引言 作为一名深耕操作系统和嵌入式开发的工程师&#xff0c;我深知调试的重要性。在系统开发中&#xff0c;良好的调试能力可以快速定位和解决问题&#xff0c;提高系统的可靠性。在 Linux 内核中&#xff0c;调试技术…...

Obsidian插件终极汉化指南:obsidian-i18n让英文插件秒变中文界面

Obsidian插件终极汉化指南&#xff1a;obsidian-i18n让英文插件秒变中文界面 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n 你是否因为Obsidian插件的英文界面而头疼&#xff1f;面对"Backlink"、"Graph …...

U盘检测工具

U盘真假检测工具下载网址...

从零开始:使用Deepspeed ZeRO3优化Qwen3-8B微调,解决多卡显存不足问题

从零开始&#xff1a;使用Deepspeed ZeRO3优化Qwen3-8B微调&#xff0c;解决多卡显存不足问题 当你面对一个8B参数规模的大语言模型时&#xff0c;单卡训练往往显得力不从心。显存不足的报错就像一堵高墙&#xff0c;阻挡着许多开发者的探索之路。而多卡并行训练又带来了新的挑…...