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

c++学习-this指针

1.基本概念

非静态成员函数都会默认传递this指针(静态成员函数属于类本身,不属于某个实例对象),方便访问对象对类成员变量和 成员函数。

2.基本使用

编译器实际处理类成员函数,this是第一个隐藏的参数,类型为指向当前对象的指针

void func();             // 表面形式
void func(MyClass* this);  // 实际内部形式

编辑代码

class MyClass {
public:int a;void show() {std::cout << a << std::endl; // 相当于 std::cout << this->a;}
};

编译器处理

void show(MyClass* this) {std::cout << this->a << std::endl;
}

2.1区分参数和类成员变量

类成员函数中变量/函数查找顺序:①当前作用域->②函数参数->③类成员变量/函数(通过this指针查找)->④父类成员->⑤编译器报错。

通过this指针可以区分类成员变量还是传入参数

#include <iostream>using namespace std;class Persion {
public:void SetAge(int age) {this->age = age; // this指针指向调用成员函数的对象本身}void SetHeight(double height) {height = height; // 优先使用局部变量height,未使用this指针}void ShowAge() {cout << "Age: " << age << endl; // 使用this指针访问成员变量}	void ShowHeight() {cout << "Height: " << height << endl; // 使用this指针访问成员变量}int age = 0;double height = 0;
};int main() {Persion p;p.SetAge(25);p.SetHeight(175.5);p.ShowAge();    // 输出: Age: 25p.ShowHeight(); // 输出: Height: 0return 0;
}

ShowAge方法中,先查找函数作用域没有age变量,通过隐藏this指针查找到类成员变量age

2.2链式调用

通过返回this可以实现链式调用

#include <iostream>using namespace std;class Persion {
public://需要使用返回Person的引用的方式,才能实现链式调用,否则会重新创建一个对象Persion& SetAge(int age) {this->age = age; // this指针指向调用成员函数的对象本身return *this; // 返回对象本身的引用}Persion& SetHeight(double height) {this->height = height; // 优先使用局部变量height,未使用this指针return *this; // 返回对象本身的引用}void ShowAge() {cout << "Age: " << age << endl; // 使用this指针访问成员变量}	void ShowHeight() {cout << "Height: " << height << endl; // 使用this指针访问成员变量}int age = 0;double height = 0;
};int main() {Persion p;p.SetAge(25).SetHeight(175.5);p.ShowAge();    // 输出: Age: 25p.ShowHeight(); // 输出: Height: 175.5return 0;
}

3.问题

1.非静态类成员函数中使用的this是类成员变量还是编译器隐式传递的this参数

this指针不是一个类成员变量,类成员函数中使用的this指针是编译器隐式传递的this参数。(这就是为什么静态成员函数里不能使用类成员变量和类成员函数,因为静态成员函数没有this指针参数,在函数内部就无法通过this指针找到对应的实例对象的成员变量以及成员函数)

#include <iostream>using namespace std;class Persion {//this指针是隐含在所有非静态成员函数中的一个指针,指向调用该成员函数的对象,编译器会自动传递this指针//this指针不是类成员变量
public://非静态成员函数编译器会自动传递this指针void setAge(int a) {this->age = a;//通过this指针访问成员变量}//静态成员函数编译器不会自动传递this指针static void getAge() {cout << "age is " << this->age << endl;//报错,静态成员函数没有this指针}int age;
};int main() {Persion p;return 0;
}

2.什么情况自动获取this指针并传递给类成员函数,什么时候需要手动传递?

编译器自动传递this指针:在非静态成员函数内部调用类成员函数和类成员变量时(非静态成员函数本身有隐藏this指针参数)或则通过对象直接调用非静态成员函数时(编译器会根据对象自动生成指向该对象的指针),this指针会被编译器自动传递。

需要手动传递this指针:当将静态成员函数“脱离对象上下文”传递(如给线程或lambda表达式,必须手动指定this。

#include <iostream>
#include <thread>using namespace std;class Persion {
public://需要使用返回Person的引用的方式,才能实现链式调用,否则会重新创建一个对象Persion& SetAge(int age) {this->age = age; // this指针指向调用成员函数的对象本身return *this; // 返回对象本身的引用}Persion& SetHeight(double height) {this->height = height; // 优先使用局部变量height,未使用this指针return *this; // 返回对象本身的引用}void ShowAge() {cout << "Age: " << age << endl; // 使用this指针访问成员变量}	void ShowHeight() {cout << "Height: " << height << endl; // 使用this指针访问成员变量}void testThisPoint() {std::thread t1(&Persion::ShowAge, this); // 传递this指针,必须显示传递类成员函数ShowAge第一个参数thisstd::thread t2([this]() { ShowHeight(); }); // 使用lambda表达式捕获this指针,表示式作用域内找不到ShowHeight方法,再通过this指针访问t1.join();t2.join();std::cout << t1.joinable() << std::endl;std::cout << t2.joinable() << std::endl;}int age = 0;double height = 0;
};int main() {Persion p;p.SetAge(25).SetHeight(175.5);p.testThisPoint();return 0;
}

3.成员函数如何区分使用变量是类成员变量还是未定义变量或则传入参数变量?this指针工作原理

层层查找,和普通变量作用域一样,从内到外层层查找

①当前作用域->②函数参数->③类成员变量/函数(通过this指针查找)->④父类成员->⑤编译器报错。

4.总结

1.this指针不是一个类成员变量,类成员函数中使用的this指针是编译器隐式传递的this参数。

相关文章:

c++学习-this指针

1.基本概念 非静态成员函数都会默认传递this指针&#xff08;静态成员函数属于类本身&#xff0c;不属于某个实例对象&#xff09;&#xff0c;方便访问对象对类成员变量和 成员函数。 2.基本使用 编译器实际处理类成员函数&#xff0c;this是第一个隐藏的参数&#xff0c;类…...

交易所系统攻坚:高并发撮合引擎与合规化金融架构设计

交易所系统攻坚&#xff1a;高并发撮合引擎与合规化金融架构设计 ——2025年数字资产交易平台的性能与合规双轮驱动 一、高并发撮合引擎&#xff1a;从微秒级延迟到百万TPS 核心架构设计 订单簿优化&#xff1a;数据结构创新&#xff1a;基于红黑树与链表混合存储&#xff0c…...

OpenCV计算机视觉实战(10)——形态学操作详解

OpenCV计算机视觉实战&#xff08;10&#xff09;——形态学操作详解 0. 前言1. 腐蚀与膨胀1.1 为什么要做腐蚀与膨胀1.2 OpenCV 实现 2. 开运算与闭运算2.1 开运算与闭运算原理2.2 OpenCV 实现 3. 形态学梯度与骨架提取3.1 形态学梯度3.2 骨架提取 小结系列链接 0. 前言 形态…...

libiec61850 mms协议异步模式

之前项目中使用到libiec61850库&#xff0c;都是服务端开发。这次新的需求要接收服务端的遥测数据&#xff0c;这就涉及到客户端开发了。 客户端开发没搞过啊&#xff0c;挑战不少&#xff0c;但是人不就是通过战胜困难才成长的嘛。通过查看libiec61850的客户端API发现&#xf…...

[论文阅读] 人工智能 | 利用负信号蒸馏:用REDI框架提升LLM推理能力

【论文速读】利用负信号蒸馏&#xff1a;用REDI框架提升LLM推理能力 论文信息 arXiv:2505.24850 cs.LG cs.AI cs.CL Harnessing Negative Signals: Reinforcement Distillation from Teacher Data for LLM Reasoning Authors: Shuyao Xu, Cheng Peng, Jiangxuan Long, Weidi…...

基于 NXP + FPGA+Debian 高可靠性工业控制器解决方案

在工业系统开发中&#xff0c;**“稳定”**往往比“先进”更重要。设备一旦部署&#xff0c;生命周期动辄 5~10 年&#xff0c;系统重启或异常恢复成本高昂。 这时候&#xff0c;一套“值得托付”的软硬件组合&#xff0c;就显得尤为关键。 ✅ NXP —— 提供稳定、长期供货的工…...

CSS 选择器全解析:分组选择器/嵌套选择器,从基础到高级

一、CSS 选择器基础&#xff1a;从单个元素到多个元素 CSS 选择器是用来定位 HTML 元素的工具&#xff0c;就像 “元素的地址”。最基础的选择器有&#xff1a; 元素选择器&#xff08;按标签名定位&#xff09; css p { color: red; } /* 所有<p>标签 */ div { b…...

uniapp 对接腾讯云IM群公告功能

UniApp 实战&#xff1a;腾讯云IM群公告功能 一、前言 在即时通讯场景中&#xff0c;群公告是信息同步的重要渠道。本文将基于uniapp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群公告的发布、修改、历史记录查询等核心功能。 群公告的数据结构设计权限校…...

垂起固定翼无人机应用及技术分析

一、主要应用行业 1. 能源基础设施巡检 电力巡检&#xff1a;适用于超高压输电线路通道的快速巡查&#xff0c;实时回传数据提升智能运检效率。 油田管道监测&#xff1a;利用长航时特性&#xff08;1.5-2小时&#xff09;对大范围管道进行隐患排查&#xff0c;减少人力巡…...

Python Robot Framework【自动化测试框架】简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

vite配置@别名,以及如何让IDE智能提示路经

1.配置路径(vite.config.js) // vite.config.js import { defineConfig } from "vite"; import vue from "vitejs/plugin-vue"; import path from "path";// https://vite.dev/config/ export default defineConfig({server: {port: 8080,},plu…...

c#bitconverter操作,不同变量类型转byte数组

缘起:串口数据传输的基础是byte数组&#xff0c;write(buff,0,num)或者writeline(string)&#xff0c;如果是字符串传输就是string变量就可以了&#xff0c;但是在modbus这类hex传递时&#xff0c;就要遇到转换了&#xff0c;拼凑byte数组时需要各种变量的值传递&#xff0c;解…...

【Linux】LInux下第一个程序:进度条

前言&#xff1a; 在前面的文章中我们学习了LInux的基础指令 【Linux】初见&#xff0c;基础指令-CSDN博客【Linux】初见&#xff0c;基础指令&#xff08;续&#xff09;-CSDN博客 学习了vim编辑器【Linux】vim编辑器_linux vim insert-CSDN博客 学习了gcc/g【Linux】编译器gc…...

RPA+AI:自动化办公机器人开发指南

RPAAI&#xff1a;自动化办公机器人开发指南 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 RPAAI&#xff1a;自动化办公机器人开发指南摘要引言技术融合路径1. 传感器层&#xff1a;多模态数据接入2. 决策层&…...

daz3d + PBRSkin (MDL)+ SSS

好的&#xff0c;我们来解释一下 Daz3D 中的 PBRSkin (MDL) Shader。 简单来说&#xff0c;PBRSkin (MDL) 是 Daz Studio 中一种基于物理渲染&#xff08;PBR&#xff09;技术、专门用于创建高度逼真人物皮肤效果的着色器&#xff08;Shader&#xff09;。 它利用 NVIDIA 的材…...

计算矩阵A和B的乘积

根据矩阵乘法规则&#xff0c;编程计算矩阵的乘积。函数fix_prod_ele()是基本方法编写&#xff0c;函数fix_prod_opt()是优化方法编写。 程序代码 #define N 3 #define M 4 typedef int fix_matrix1[N][M]; typedef int fix_matrix2[M][N]; int fix_prod_ele(f…...

Houdini POP入门学习05 - 物理属性

接下来随着教程学习碰撞部分&#xff0c;当粒子较为复杂或者下载了一些粒子模板进行修改时&#xff0c;会遇到一些较奇怪问题&#xff0c;如粒子穿透等&#xff0c;这些问题实际上可以通过调节参数解决。 hip资源文件&#xff1a;https://download.csdn.net/download/grayrail…...

每日Prompt:双重曝光

提示词 新中式&#xff0c;这幅图像将人体头像轮廓与山水中式建筑融为一体&#xff0c;双重曝光&#xff0c;体现了反思、内心平静以及人与自然相互联系的主题&#xff0c;靛蓝&#xff0c;水墨画&#xff0c;晕染&#xff0c;极简...

sendDefaultImpl call timeout(rocketmq)

rocketmq 连接异常 senddefaultimpl call timeout-腾讯云开发者社区-腾讯云 第一种情况&#xff1a; 修改broker 的配置如下&#xff0c;注意brokerIP1 这个配置必须有&#xff0c;不然 rocketmq-console 显示依然是内网地址 caused by: org.apache.rocketmq.remoting.excep…...

【LLM】多智能体系统 Why Do Multi-Agent LLM Systems Fail?

note 构建一个成功的 MAS&#xff0c;不仅仅是提升底层 LLM 的智能那么简单&#xff0c;它更像是在构建一个组织。如果组织结构、沟通协议、权责分配、质量控制流程设计不当&#xff0c;即使每个成员&#xff08;智能体&#xff09;都很“聪明”&#xff0c;整个系统也可能像一…...

CSS 定位:原理 + 场景 + 示例全解析

一. 什么是CSS定位? CSS中的position属性用于设置元素的定位方式,它决定了元素在页面中的"定位行为" 为什么需要定位? 常规布局(如 display: block)适用于主结构 定位适用于浮动按钮,弹出层,粘性标题等场景帮助我们精确控制元素在页面中的位置 二. 定位类型全…...

如何在没有 iTunes 的情况下备份 iPhone

我可以在没有 iTunes 的情况下将 iPhone 备份到电脑吗&#xff1f;虽然 iTunes 曾经是备份 iPhone 的主要方法&#xff0c;但它并不是 iOS 用户唯一的备份选项。您可以选择多种方便的替代方案来备份 iPhone&#xff0c;无需使用 iTunes。您可以在这里获得更灵活、更人性化的备份…...

如何把 Mac Finder 用得更顺手?——高效文件管理定制指南

系统梳理提升 Mac Finder 体验的实用设置与技巧&#xff0c;助你用更高效的方式管理文件。文末引出进阶选择 Path Finder。 阅读原文请转到&#xff1a;https://jimmysong.io/blog/customize-finder-for-efficiency/ 作为一个用 Mac 多年的用户&#xff0c;我始终觉得 Finder 虽…...

赋能大型语言模型与外部世界交互——函数调用的崛起

大型语言模型 (LLM) 近年来在自然语言处理领域取得了革命性的进展&#xff0c;展现出强大的文本理解、生成和对话能力。然而&#xff0c;这些模型在与外部实时数据源和动态系统交互方面存在固有的局限性 1。它们主要依赖于训练阶段学习到的静态知识&#xff0c;难以直接访问和利…...

04 Deep learning神经网络编程基础 梯度下降 --吴恩达

梯度下降在深度学习的应用 梯度下降是优化神经网络参数的核心算法,通过迭代调整参数最小化损失函数。 核心公式 参数更新规则: θ t + 1 = θ t − η ∇ J ( θ...

手拉手处理RuoYi脚手架常见文问题

若依前后端分离版开发入门 基础环境&#xff1a;JDK1.8mysqlRedisMavenVue 取消登录验证码 后端 修改ruoyi-ui项目中的login.vue 在ruoyi-ui项目>src>views中找到login.vue文件 1、注释验证码展示及录入部分 2、 注释code必填校验&#xff0c;默认验证码开关为false …...

录制mp4

目录 单线程保存mp4 多线程保存mp4 rtsp ffmpeg录制mp4 单线程保存mp4 import cv2 import imageiocv2.namedWindow(photo, 0) # 0窗口大小可以任意拖动&#xff0c;1自适应 cv2.resizeWindow(photo, 1280, 720) url "rtsp://admin:aa123456192.168.1.64/h264/ch1/main…...

Dynamics 365 Finance + Power Automate 自动化凭证审核

&#x1f680; Dynamics 365 Finance Power Automate 自动化凭证审核 &#x1f4d1; 目录 &#x1f680; Dynamics 365 Finance Power Automate 自动化凭证审核1. 依赖 &#x1f527;2. 目标 &#x1f3af;3. 系统架构 &#x1f3d7;️4. 凭证审批全流程 &#x1f6e0;️4.1 …...

使用 Python + SQLAlchemy 创建知识库数据库(SQLite)—— 构建本地知识库系统的基础《一》

&#x1f4da; 使用 Python SQLAlchemy 创建知识库数据库&#xff08;SQLite&#xff09;—— 构建本地知识库系统的基础 &#x1f9e0; 一、前言 随着大模型技术的发展&#xff0c;越来越多的项目需要构建本地知识库系统来支持 RAG&#xff08;Retrieval-Augmented Generat…...

使用柏林噪声生成随机地图

简单介绍柏林噪声 柏林噪声&#xff08;Perlin Noise&#xff09;是一种由 Ken Perlin 在1983年提出的梯度噪声&#xff08;Gradient Noise&#xff09;算法&#xff0c;用于生成自然、连续的随机值。它被广泛用于计算机图形学中模拟自然现象&#xff08;如地形、云层、火焰等…...