C++语言基础4:例程讲解(结合在QT的应用)
我们从最基础的语法、每个关键字 / 符号的含义、每一行的执行逻辑逐句拆解全程用新手能理解的表述你可以对着代码一行一行看。例程如下void TemperatureBar::update_data(int base_address, const QVectorquint16 value) { Q_UNUSED(base_address); int offset m_address - m_base_address; if (offset 0 offset value.size()) { quint16 raw_value value.at(offset); float display_value raw_value; if (m_is_shift) { display_value raw_value / 10.0f; } set_value(display_value); } }先整体说下这是 Qt/C 里一个自定义控件类TemperatureBar温度条控件的成员函数功能是接收一批寄存器原始数据计算出当前温度条对应的数据转换成真实温度值后更新控件显示。逐行逐字语法详解第 1 行函数定义函数头void TemperatureBar::update_data(int base_address, const QVectorquint16 value)这是整个函数的声明 定义开头我们拆成每一部分讲void函数的返回值类型。void表示 “空”意思是这个函数执行完之后不会返回任何结果给调用者只负责执行内部的逻辑。TemperatureBar::update_dataupdate_data是函数名。::叫作用域解析符它的作用是明确说明update_data不是普通的全局函数而是TemperatureBar这个类里面的成员函数。补充TemperatureBar是一个自定义的类温度条控件类这个函数是它的功能之一。(int base_address, const QVectorquint16 value)括号里是函数的参数列表也就是调用这个函数时需要传进来的数据这里有 2 个参数第一个参数int base_addressint参数类型整数型。base_address参数名意思是 “基地址”一般代表批量读取寄存器时的起始地址。第二个参数const QVectorquint16 value这部分新手最容易懵我们拆开讲QVectorQt 框架提供的动态数组容器相当于一个可以自动变长的数组用来存一组同类型的数据类似 C 标准库里的std::vector。quint16模板参数说明这个QVector数组里每个元素都是quint16类型。quint16是 Qt 定义的标准类型无符号 16 位整数对应原生 C 的unsigned short占 2 个字节取值范围 0~65535工业通信里一般用来存寄存器的原始数据。引用符号这里表示 “传引用”而不是 “传值”。好处不用把整个数组复制一份直接操作原数据效率很高尤其是数组很大的时候。const常量修饰符和引用搭配叫 “常引用”。作用保证这个数组在函数里只能读、不能改防止代码不小心修改了原始数据同时也是 C 的规范写法。value参数名就是传进来的原始数据数组。第 2 行函数体开始{大括号{ }用来包裹函数的所有执行代码左大括号代表函数逻辑开始最后一行的右大括号代表函数结束。第 3 行消除未使用参数警告Q_UNUSED(base_address);Q_UNUSED()Qt 提供的一个宏可以理解成 Qt 预先定义好的语法标记。作用告诉编译器“base_address这个参数我是故意不用的不要给我报‘未使用的参数’的警告”。为什么传了又不用这个函数一般是统一的接口规范比如所有同类控件的更新函数都必须有基地址这个参数但TemperatureBar这个控件自己的逻辑用不到基地址所以用这个宏来消除编译警告不影响程序运行。第 4 行计算数据在数组中的偏移位置int offset m_address - m_base_address;int offset定义一个整数类型的局部变量名字叫offset意思是 “偏移量 / 下标”。赋值符号把右边的计算结果存到左边的变量里。m_address和m_base_address这两个都是TemperatureBar类的成员变量m_前缀是 C/Qt 的通用命名规范是member的缩写用来一眼区分 “类的成员变量” 和 “函数里的临时变量”。m_address当前这个温度条对应的寄存器地址。m_base_address这一批数据对应的寄存器起始基地址。计算逻辑当前地址 - 起始基地址 这个温度条的数据在数组里的下标位置。 举个例子基地址是 100当前温度条地址是 103那偏移量就是 3对应数组里第 3 个元素数组下标从 0 开始数。第 5 行数组下标越界安全判断if (offset 0 offset value.size()) {这是非常重要的安全防护代码新手最容易漏掉这一步导致程序崩溃。if (条件) { ... }条件判断语句只有括号里的条件成立结果为真才会执行大括号里的代码。条件由两部分组成用连接逻辑与运算符意思是 “并且”只有左右两个条件都成立整体条件才成立。第一个条件offset 0偏移量不能是负数。因为数组下标从 0 开始负数下标是非法的会访问到错误内存。第二个条件offset value.size()value.size()QVector的成员函数返回数组里元素的总个数。意思是偏移量必须小于数组总长度。比如数组有 5 个元素长度是 5合法下标是 0~4所以 offset 必须小于 5。整行作用确保要访问的数组下标是合法的防止数组越界访问数组外面的内存导致程序直接崩溃。只有偏移量在合法范围内才去更新数据。第 6 行取出对应位置的原始数据quint16 raw_value value.at(offset);quint16 raw_value定义一个 16 位无符号整数的局部变量叫raw_value原始值用来存从数组里取出来的寄存器原始数据。value.at(offset)at()是QVector的成员函数作用是获取数组中下标为offset的那个元素。补充QVector 取值有两种写法value[offset]和value.at(offset)。at()会自带越界检查越界时会安全报错[]运算符越界会直接崩溃所以这里用at()是更规范安全的写法。整行意思从数据数组里取出偏移量对应位置的原始 16 位数据存到raw_value变量里。第 7 行初始化显示值float display_value raw_value;float display_value定义一个单精度浮点型变量叫display_value显示值也就是最终要显示在温度条上的真实数值。 raw_value把原始整数值直接赋值给浮点型变量。这里会发生隐式类型转换自动把整数的quint16转成带小数的float。比如原始值是 25转完就是 25.0。为什么要用浮点型因为温度值经常带小数比如 25.6℃整数存不了小数所以需要用浮点型来存最终的显示值。第 8 行判断是否需要数值缩放if (m_is_shift) {m_is_shift类的成员变量bool布尔类型只有true真 /false假 两个值。意思是 “是否需要移位 / 缩放”也就是控制 “原始值要不要除以 10 来还原真实温度” 的开关。为什么要有这个开关工业通信里很多传感器会把温度放大 10 倍 / 100 倍后用整数传输比如 25.6℃存成整数 256但也有的传感器直接传整数温度。所以用这个开关来兼容两种情况初始化控件的时候设置好就行。第 9 行数值缩放还原真实温度display_value raw_value / 10.0f;给display_value重新赋值覆盖掉之前的原始值。raw_value / 10.0f原始值除以 10.0。重点注意10.0f末尾的f表示这是float类型的浮点数。如果写成raw_value / 10整数除以整数那就是整数除法会直接丢掉小数部分比如256 / 10 25写成10.0f就是浮点数除法会保留小数256 / 10.0f 25.6这才是我们要的真实温度。整行意思如果开启了缩放就把原始整数除以 10得到带小数的真实温度值。第 10 行缩放判断结束}右大括号对应第 8 行if (m_is_shift)的左大括号缩放逻辑的代码块到此结束。第 11 行更新温度条控件的显示set_value(display_value);set_value()这是TemperatureBar类或者它的父类的成员函数。作用把计算好的真实数值设置给温度条控件更新界面上的显示 —— 比如更新进度条的长度、更新旁边的数字显示等等。这是整个函数的最终目的前面所有计算都是为了得到正确的数值最后调用这个函数完成界面更新。第 12 行合法数据处理结束}右大括号对应第 5 行if (offset 0 ...)的左大括号合法数据的处理逻辑到此结束。 如果偏移量不合法这一大段代码都会直接跳过什么都不做保证程序安全。第 13 行函数结束}最外层的右大括号整个update_data函数的代码到此全部结束。整体执行流程梳理帮你串起来理解这个函数从调用到结束完整走一遍是这样的外部传入「寄存器基地址」和「一批寄存器原始数据数组」。计算当前温度条对应的数据在数组里的下标位置。检查下标是否合法不合法就直接结束防止崩溃。合法的话取出对应位置的原始 16 位整数。根据控件的缩放开关决定要不要把原始值除以 10得到真实的温度显示值。把最终数值设置给温度条控件更新界面显示。补充两个重要的代码规范m_前缀命名类的成员变量统一加m_前缀是行业通用规范。好处是不用翻定义一眼就能分清 “哪个是类的成员变量”“哪个是函数里的临时局部变量”。越界保护只要操作数组 / 容器就一定要先判断下标是否合法这是避免程序崩溃的最基础也最重要的习惯这段代码的写法非常标准。

相关新闻

B11:AI 时代怎么跨部门协作?我用 4 步说服了销售、HR、IT 一起推 AI

B11:AI 时代怎么跨部门协作?我用 4 步说服了销售、HR、IT 一起推 AI

文章目录 B11:AI 时代怎么跨部门协作?我用 4 步说服了销售、HR、IT 一起推 AI 🎯 开篇:我做了一个 AI 工具,演示给销售总监看,他说了一句话 一、那天晚上,我想通了一件事 二、AI 时代,跨部门协作为什么变难了? 2.1 第一个难:AI 是"全公司的事",不是"…

2026/7/5 14:07:32阅读更多 →
Leetcode新动循环嵌套之数组异或操作、好数对的数目、统计好三元组

Leetcode新动循环嵌套之数组异或操作、好数对的数目、统计好三元组

1486.数组异或操作class Solution:def xorOperation(self, n: int, start: int) -> int:nums []for i in range(n):nums.append(start 2*i)resultnums[0]for i in range(1,n):result ^ nums[i]return result1512.好数对的数目class Solution:def numIdenticalPairs(self,…

2026/7/5 14:07:32阅读更多 →
[特殊字符] Oracle EBS 中国客户(校正版)华为确实是 Oracle EBS 的老客户,不是 SAP。时间线先给你对齐:华为 1996 年引入 MRP Ⅱ,之后 20 多年核心 ERP 是

[特殊字符] Oracle EBS 中国客户(校正版)华为确实是 Oracle EBS 的老客户,不是 SAP。时间线先给你对齐:华为 1996 年引入 MRP Ⅱ,之后 20 多年核心 ERP 是

🟢 Oracle EBS 中国客户(校正版)华为确实是 Oracle EBS 的老客户,不是 SAP。时间线先给你对齐:华为 1996 年引入 MRP Ⅱ,之后 20 多年核心 ERP 是 Oracle EBS,支撑全球 170 国家、每年数千亿产值…

2026/7/5 14:07:32阅读更多 →
SARSteer: Safeguarding Large Audio Language Models via Safe-Ablated Refusal Steering

SARSteer: Safeguarding Large Audio Language Models via Safe-Ablated Refusal Steering

文章核心总结与翻译 一、主要内容 本文聚焦大型音频语言模型(LALMs)的安全对齐问题,针对现有LLM和LVLM安全防御方法直接迁移至LALMs时存在的两大缺陷(音频输入下基于LLM的引导失效、基于提示的防御导致良性查询过度拒绝),提出了首个推理时防御框架SARSteer(Safe-Ablat…

2026/7/5 15:17:44阅读更多 →
Explainability of Large Language Models: Opportunities and Challenges toward Generating Trustwort...

Explainability of Large Language Models: Opportunities and Challenges toward Generating Trustwort...

文章核心总结与创新点 主要内容 文章聚焦大型语言模型(LLMs)的可解释性,围绕局部可解释性和机制可解释性两大核心方向展开。首先梳理了LLMs的发展背景与Transformer架构基础,系统综述了现有局部可解释性(如思维链推理、检索增强生成等)和机制可解释性(如注意力头分析、…

2026/7/5 15:17:44阅读更多 →
用optiland绘制光扇图

用optiland绘制光扇图

文章目录光扇图的基本概念测试RayFan光扇图的基本概念 Ray Fan即光扇图,是光学设计中用于分析一维截面上几何像差的核心工具。与点列图展示二维平面上的光斑分布不同,Ray Fan 将三维的光线追迹结果降维,通过二维曲线直观地展示横向像差&…

2026/7/5 15:17:44阅读更多 →
如何去除 AI 输出文本中带 *、# 的小技巧,选用 AI 导出鸭优化文档导出,结合行业数据根除多余格式符号困扰

如何去除 AI 输出文本中带 *、# 的小技巧,选用 AI 导出鸭优化文档导出,结合行业数据根除多余格式符号困扰

摘要 AI生成内容时常附带星号、井号等markdown标记符号,手动清理耗费大量办公时间。本文围绕去除特殊符号的实用技巧展开,结合市面五种主流文档导出方案横向测评,引用行业白皮书实测数据与业内专家观点,搭配用户实测反馈与问答科普…

2026/7/5 15:17:44阅读更多 →
P1634 禽兽的传染病

P1634 禽兽的传染病

题目背景mxj 的启发。题目描述禽兽患传染病了。一个禽兽会每轮传染 x 个禽兽。试问 n 轮传染后有多少禽兽被传染?输入格式两个非负整数 x 和 n。输出格式一个整数,即被传染的禽兽数。输入输出样例输入 #1复制10 2输出 #1复制121说明/提示保证 x,n 以及答…

2026/7/5 15:17:44阅读更多 →
AsrTools终极指南:5分钟学会高效语音转文字技巧

AsrTools终极指南:5分钟学会高效语音转文字技巧

AsrTools终极指南:5分钟学会高效语音转文字技巧 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text i…

2026/7/5 15:12:37阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/5 3:48:10阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/5 3:48:09阅读更多 →