C++/QT 开发技能树详解

一、 编程语言 (C++)

1. C++基础语法(数据类型、模板、命名空间)

  • 是什么: 这是构建C++程序的基石。数据类型定义了变量存储的数据种类和大小;模板允许编写与数据类型无关的通用代码;命名空间用于避免大型项目中的名称冲突。

  • 如何理解

    • 数据类型: 如 intdoublechar 是基础类型;std::stringstd::vector 是标准库定义的复杂类型。理解它们的内存占用和操作代价对性能优化至关重要。

    • 模板: 可以把它理解为一个“代码模具”。比如您项目中的 std::vector<int> 和 std::vector<std::string>,编译器会根据这个“模具”生成两份分别处理int和string的代码。这是C++实现泛型编程的核心。

    • 命名空间: 类似于文件系统的目录。std::cout 意味着在std这个“目录”下找cout。您也可以创建自己的命名空间来组织代码,防止和第三方库的符号冲突。

  • 如何使用

    • 在定义变量时选择最合适的数据类型。

    • 使用模板来编写通用函数(如 template <typename T> T max(T a, T b))和通用类。

    • 在自己的库或模块中使用 namespace MyProject { ... } 来封装代码。使用 using namespace std; 需谨慎,尤其在头文件中。

2. 指针

  • 是什么: 指针是一个变量,其值是另一个变量的内存地址。

  • 如何理解: 指针就是地址

它提供了直接操作内存的能力,非常强大但也容易出错(如空指针、野指针)。在C++中,它常用于动态内存分配、数组遍历、函数传参(避免拷贝大对象)等。

  • 如何使用

    • 动态分配内存:int *ptr = new int;,记得用 delete ptr; 释放。

    • 传递函数参数:void modifyValue(int *ptr) { *ptr = 10; },允许函数修改外部变量的值。

    • 访问数组:数组名本质上就是一个指向数组首元素的指针。

    • 现代C++建议: 优先使用智能指针 (std::unique_ptrstd::shared_ptr),它们可以自动管理内存生命周期,极大减少内存泄漏的风险。

3. Lambda 表达式

  • 是什么: 一种匿名函数对象,可以在代码中就地定义短小的函数,而无需正式声明一个函数。

  • 如何理解: 它类似于JavaScript中的箭头函数。它捕获上下文变量、接受参数、并有一个函数体。它使得代码更简洁,尤其是在与STL算法配合时。

  • 如何使用

    • 基本语法:[capture] (parameters) -> return_type { function_body }

    • 捕获列表 [capture] 是关键:

      • [=]:以值的方式捕获所有外部变量。

      • [&]:以引用的方式捕获所有外部变量。

      • [a, &b]:以值捕获a,以引用捕获b。

    • 示例:与 std::sort 或 std::for_each 配合使用。

      std::vector<int> vec = {4, 2, 5, 1};
      std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; }); // 降序排列

4. 面向对象:封装、继承、多态

  • 是什么: 面向对象编程的三大核心特性。

  • 如何理解与使用

    • 封装: 将数据(属性)和操作数据的方法(函数)绑定在一起,并隐藏内部实现细节,只暴露接口。通过 class 和访问控制符 publicprivateprotected 实现。在您的项目中,每个模块的类设计都体现了封装思想。

    • 继承: 允许一个新类(派生类)继承另一个类(基类)的属性和方法,实现代码复用和层次化设计。如 class Dog : public Animal {}

    • 多态: 允许不同类的对象对同一消息做出不同的响应。通常通过基类的虚函数指针/引用来实现。

      class Shape {
      public:virtual void draw() = 0; // 纯虚函数,抽象基类
      };
      class Circle : public Shape {
      public:virtual void draw() override { /* 画一个圆 */ }
      };
      // 多态的使用
      Shape *shape = new Circle();
      shape->draw(); // 调用的是 Circle::draw()
    • 在您项目中的应用: QT的整个 widget 系统就是基于继承和多态。QPushButton 继承自 QWidget,您可以重写 paintEvent 等虚函数来实现自定义UI。


二、 内存管理

1. 堆栈机制

  • 是什么: 程序运行时内存管理的两种基本方式。

  • 如何理解

    • : 由编译器自动分配和释放。存放局部变量、函数参数等。分配速度快,但空间有限,生命周期与函数作用域绑定。

    • : 由程序员手动分配和释放(new/delete 或 malloc/free)。空间大,分配速度慢,生命周期由程序员控制,管理不当会导致内存泄漏或野指针。

  • 如何使用: 小型、生命周期短的变量用栈。大型对象、需要动态控制生命周期的对象用堆(并尽量用智能指针管理)。

2. 手动内存管理

  • 是什么: 使用 new 和 delete 成对操作来在堆上分配和释放内存。

  • 如何理解: 谁申请,谁释放。忘记释放会导致内存泄漏;释放后再次使用会导致未定义行为。在复杂流程中,确保在每一个分支路径上都正确释放内存非常具有挑战性。

  • 如何使用: 强烈建议在现代C++项目中避免直接使用 new/delete。使用 std::vectorstd::string 等容器以及 std::unique_ptr 和 std::shared_ptr 等智能指针来自动化内存管理。您在“性能优化”中提到的“内存池”是更高级的手动内存管理技术,用于特定性能敏感场景。


三、 QT 框架

1. 信号和槽

  • 是什么: QT的核心机制,用于对象之间的通信。它是一种类型安全的“观察者模式”。

  • 如何理解: 当某个对象(发送者)的状态发生变化时,它会发射一个信号。另一个对象(接收者)的函数可以对这种变化做出响应。它们通过 QObject::connect 函数连接。

  • 如何使用

    // 声明
    class Sender : public QObject {Q_OBJECT
    signals:void valueChanged(int newValue);
    };
    class Receiver : public QObject {Q_OBJECT
    public slots:void handleValueChange(int value) { ... }
    };
    // 连接
    Sender s; Receiver r;
    QObject::connect(&s, &Sender::valueChanged, &r, &Receiver::handleValueChange);
    // 触发
    emit s.valueChanged(10); // 此后,r.handleValueChange(10) 会被自动调用
    • 在您项目中的应用: 这是QT程序事件驱动的基石。按钮点击、定时器超时、网络数据到达等,都是通过信号和槽来通知和处理的。

2. 事件过滤器

  • 是什么: 一种更高级的事件处理机制,允许一个对象监视并拦截发送给另一个对象的事件。

  • 如何理解: 比如主窗口可以安装事件过滤器来监听所有子控件的事件(如鼠标点击、按键),并在事件到达目标控件之前先进行处理或过滤掉。

  • 如何使用

    1. 在监视者对象中重写 eventFilter(QObject *watched, QEvent *event) 方法。

    2. 调用 watchedObject->installEventFilter(filterObject); 进行安装。

    • 在您项目中的应用: 可用于实现全局快捷键、自定义鼠标行为、验证输入等。

3. 多线程编程

  • 是什么: 使用 QThread 等类来并发执行任务,防止耗时操作阻塞主线程(UI线程)。

  • 如何理解: QT推荐使用工作线程模式,而非继承QThread。即将一个的工作对象(继承自QObject)移动到一个线程中,通过信号和槽与主线程通信。

  • QThread *thread = new QThread;
    Worker *worker = new Worker; // Worker 是一个QObject
    worker->moveToThread(thread); // 关键步骤
    // 连接信号槽:启动线程、开始工作、汇报进度、结束线程
    connect(thread, &QThread::started, worker, &Worker::doWork);
    connect(worker, &Worker::resultReady, this, &MainWindow::handleResult);
    connect(worker, &Worker::finished, thread, &QThread::quit);
    connect(thread, &QThread::finished, thread, &QThread::deleteLater);
    thread->start();
    • 在您项目中的应用: 您在“广告机系统”中明确提到了“使用QThread开发专用工作线程,处理网络IO和文件操作”,这正是该模式的典型应用。


四、 图像处理 (OpenCV)

1. 图像滤波(如高斯滤波)

  • 是什么: 使用一个“核”在图像上滑动,计算邻域像素的加权平均值,用于去噪平滑

  • 如何理解: 高斯滤波的权重服从高斯分布(正态分布),中心点权重最大,越远权重越小。能很好地消除高斯噪声,并保留更多的图像边缘信息 compared to mean filter。

  • 如何使用: cv::GaussianBlur(src, dst, Size(5,5), 0);

2. 边缘检测(如Canny)

  • 是什么: 识别图像中亮度变化剧烈的点,这些点通常对应物体的边缘

  • 如何理解: Canny边缘检测是一个多阶段的算法(噪声去除->计算梯度->非极大值抑制->双阈值筛选),结果是干净、连续的边缘。

  • 如何使用: cv::Canny(src, edges, threshold1, threshold2);

3. 特征提取与匹配

  • 是什么: 特征是图像中具有独特性的局部结构(如角点、斑块)。匹配是在不同图像中寻找相同特征的过程。

  • 如何理解: 就像人的“痣”或“脸部轮廓”是特征。SIFT、SURF、ORB等算法可以提取这些特征并生成一个描述子向量。通过比较描述子向量的距离,可以判断两个特征是否匹配。

  • 在您项目中的应用: 您在“纺织面料疵点检测”项目中,提取疵点的“特征向量”就是为了后续能够对疵点进行分类和识别。


五、 开发工具 & 其他

1. 版本控制 (Git/SVN)

  • 是什么: 记录代码变更历史、协同开发的工具。

  • 核心概念

    • Git: 分布式。每个开发者都有完整的仓库克隆。常用命令:cloneaddcommitpushpullbranchmerge

    • SVN: 集中式。只有一个中央仓库。常用命令:checkoutupdatecommit

  • 如何理解: 代码的“时光机”。允许回退到任何历史版本,并行开发不同功能(分支),解决代码冲突,追踪谁在何时改了什麼。

2. 数据库 (MySQL/SQLite)

  • 是什么: 结构化数据存储和管理系统。

  • 核心概念与使用

    • SQLite: 轻量级,嵌入式的数据库,整个库就是一个文件。非常适合桌面应用、移动应用(如您的QT终端程序)作为本地存储。

    • MySQL: 强大的客户端-服务器型数据库,支持高并发、大规模数据。适合作为Web应用或分布式系统(如您的广告机管理系统)的后端数据库。

    • CRUD: 增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)是基本操作。

    • 索引: 加速查询的数据结构,理解它对于“优化数据库查询性能”至关重要。

3. 网络协议 (TCP/UDP/HTTP/MQTT)

  • 是什么: 设备之间通信的规则。

  • 如何理解与使用

    • TCP: 面向连接、可靠、有序的字节流传输。像打电话,需要建立连接,保证对方能听到。用于需要可靠性的场景(如文件传输、网页浏览)。

    • UDP: 无连接、不可靠的数据报传输。像发广播,不保证对方收到。用于实时性要求高、可容忍少量丢失的场景(如视频通话、游戏)。

    • HTTP: 基于TCP的应用层协议,是Web通信的基础(请求-响应模型)。

    • MQTT: 轻量级的发布-订阅消息协议,专为物联网设计。您在广告机项目中的核心贡献就是基于此协议。

      • 理解发布-订阅: 设备(客户端)连接到代理服务器(如EMQX)。设备订阅它感兴趣的主题(如 device/001/temperature)。另一个设备向这个主题发布消息。代理服务器负责将消息转发给所有订阅了该主题的设备。实现了发布者和订阅者的解耦

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

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

相关文章

Java多线程进阶-死锁与面试题解析

文章目录Java多线程进阶&#xff1a;死锁与面试题解析一、并发编程的噩梦——死锁1. 什么是死锁&#xff1f;四个缺一不可的条件2. 如何避免死锁&#xff1f;从破坏循环等待开始二、并发编程面试题全景解析1. 锁与同步机制2. CAS 与原子操作3. JUC 工具与线程池4. 线程安全集合…

ZYNQ启动流程——ZYNQ学习笔记11

ZYNQ SoC 的启动由片上的 BootROM 开始。片上 BootROM 是 ZYNQ 芯片上的一块非易失性存储器&#xff0c;它包含了 ZYNQ 所支持的配置器件的驱动&#xff0c; 而且里面的代码是不可修改的。 BootROM 中的代码首先会在片外的非易失性存储器中寻找一个头文件&#xff0c; 头文件里…

C++利用CerateProcess创建WPF进程并通过命名管道通讯

引言原因是我需要在C程序中调用另外一个WPF窗体打开或则关闭&#xff0c;进程之前通过通讯协议进行交互。由于使用不同语言开发&#xff0c;两者都比较复杂不方便重写&#xff0c;最方便的方法就是使用进程间通信&#xff0c;WPF窗体应用程序根据消息进行Show/Hide/Exit操作。函…

Seaborn数据可视化实战

1. Seaborn基础与实践&#xff1a;数据可视化的艺术 2. Seaborn入门&#xff1a;环境搭建与基础操作 3. Seaborn基础图表绘制入门 4. Seaborn数据可视化基础&#xff1a;从内置数据集到外部数据集的应用 5. Seaborn颜色与样式定制教程 6. Seaborn数据可视化入门&#xff1a;绘制…

BIM+写实数字孪生落地实战指南

&#x1f31f; 正文 在智慧城市与工业4.0的浪潮中&#xff0c;BIM与数字孪生的深度碰撞正在重塑建筑的生命周期。基于Revit&#xff08;RVT&#xff09;模型构建的超写实数字孪生体&#xff0c;不仅实现物理空间的毫米级镜像&#xff0c;更通过实时数据驱动&#xff0c;赋予建…

[Git] 如何拉取 GitHub 仓库的特定子目录

作为开发者&#xff0c;我们经常遇到只需要克隆大型仓库中某个子目录的场景。 Git 本身并不支持直接克隆子目录&#xff0c;但通过一些技巧可以实现类似效果。本文将介绍几种实用的方法&#xff0c;帮助获取目标代码。 为什么需要局部拉取&#xff1f; 节省时间和带宽&#xff…

修复Simulink到UE5丢包时被控船体的残影问题

提问 simulink 有一个和UE5协同的模块&#xff0c;叫做Simulation 3D Scence Configuration&#xff0c;还有一个发送来自simulink到UE5数据的模块叫做Simulation 3D Message。 现在遇到的问题是&#xff0c;这两个模块的优先级设置是正确的&#xff0c;且sample time都设置为0…

嵌入式第三十五课!!Linux下的网络编程

一、目的网络编程的目的实际上也是进程通信的一种方式&#xff0c;不过它可以在不同的主机上进行通信&#xff1b;二、需要解决的问题1. 主机与主机之间物理层面必须互联互通。指的是参与通信的计算机&#xff08;主机&#xff09;需要通过物理设备建立连接&#xff08;光纤、网…

遥感机器学习入门实战教程|Sklearn案例⑦:特征选择与重要性分析

很多同学问&#xff1a;波段/特征一多就“维度灾难”&#xff0c;训练慢、过拟合&#xff0c;且很难解释“哪些特征最关键”。本篇用 sklearn 给出一套能跑、可视化、可比较的最小工作流&#xff0c;并配上方法论速记&#xff0c;帮助你在高光谱/多特征任务里做出稳健筛选。 &a…

地理数据制备:蔚蓝地图空气质量数据的获取、清洗与坐标匹配指南

【&#x1f4ca;】手把手攻略&#xff1a;如何从“蔚蓝地图”挖宝——获取济南市可用空气质量数据全记录 一份不需要写代码也能搞定环境数据获取的实用指南 ✨ 引言&#xff1a;为什么选择蔚蓝地图&#xff1f; 作为一名环境数据爱好者&#xff0c;我经常需要获取准确、可靠、…

Unreal Engine USceneComponent

Unreal&#x1f3db; Unreal Engine - USceneComponent&#x1f4da; 定义&#x1f3f7; 类继承⚡ 关键特性⚙️ 常见配置&#x1f6e0;️ 使用方法&#x1f517; 创建与挂载&#x1f504; 获取与修改 Transform&#x1f9e9; 附加/分离组件&#x1f3ca; 典型应用场景&#x1…

2025年9月5090工作站、

在深度学习与大模型训练领域&#xff0c;算力是决定研发效率与模型性能的核心要素&#xff0c;而显卡作为算力输出的核心硬件&#xff0c;其性能参数直接影响着训练任务的速度、稳定性与成本控制。对于企业与科研机构而言&#xff0c;选择一套适配自身需求且性价比优异的显卡及…

亚矩阵云手机:亚马逊第三方店铺多账号安全合规运营的核心技术支撑

亚矩阵云手机在亚马逊第三方店铺多账号安全合规运营的技术支持&#xff0c;通过硬件级虚拟化、AI 行为建模、动态资源调度三大核心技术模块&#xff0c;构建了覆盖设备、网络、行为、数据的四维防御体系&#xff0c;确保账号在亚马逊平台规则下的长期稳定运行。以下从技术架构、…

使用C++11改进工厂方法模式:支持运行时配置的增强实现

在软件开发中&#xff0c;工厂方法模式是一种常用的设计模式&#xff0c;用于创建对象。通过使用C11的新特性&#xff0c;我们可以进一步改进工厂方法模式&#xff0c;使其更加灵活和高效。本文将详细介绍如何使用C11的std::function、lambda表达式和智能指针来实现一个支持运行…

小程序插件使用

插件介绍 插件是对一组 js 接口、自定义组件 或页面的封装&#xff0c;用于嵌入到小程序中使用。插件不能独立运行&#xff0c;必须嵌入在其他小程序中才能被用户使用&#xff1b;而第三方小程序在使用插件时&#xff0c;也无法看到插件的代码。因此&#xff0c;插件适合用来封…

要区分一张图片中的网状图(如网格结构或规则纹理)和噪点(随机分布的干扰像素),比如电路的方法 计算机视觉

要区分一张图片中的网状图&#xff08;如网格结构或规则纹理&#xff09;和噪点&#xff08;随机分布的干扰像素&#xff09;&#xff0c;需结合图像预处理、特征提取和分割算法。以下是系统化的解决方案&#xff0c;分阶段说明关键技术和算法选择&#xff1a; &#x1f50d; 一…

06_并发编程高级特性

第6课:并发编程高级特性 课程目标 掌握context包的使用 理解sync包中的同步原语 学会处理并发安全问题 掌握性能优化技巧 1. Context包 1.1 Context基础 import ("context""fmt""time" )// 基本Context使用 func basicContext()

X00238-非GNSS无人机RGB图像卫星图像视觉定位python

获取方式见文末&#xff0c;可开发票随着无人机在工业和科研领域应用的加速发展&#xff0c;在非城市环境中使用无gnss、基于视觉的方法进行无人机定位的需求日益增长。本文提出了一种基于视觉的定位算法&#xff0c;利用深度特征计算无人机在野外飞行的地理坐标。该方法基于匹…

Eino 开源框架全景解析 - 以“大模型应用的搭积木指南”方式理解

Eino 开源框架全景解析 - 大模型应用的搭积木指南 &#x1f3af; 什么是 Eino&#xff1f;一句话概括 Eino 是字节跳动开源的大语言模型应用开发框架&#xff0c;就像是一个专门为 AI 应用设计的"搭积木工具箱"&#xff0c;让开发者能够像搭乐高一样轻松构建复杂的 A…

嵌入式开发中,usb通信中输出端点和输入端点

一. 简介本文简单学习一下&#xff0c;嵌入式开发中&#xff0c;usb的输出端点和输入端点。在嵌入式开发的 USB 通信场景中&#xff0c;输出端点&#xff08;OUT Endpoint&#xff09; 和 输入端点&#xff08;IN Endpoint&#xff09; 是 USB 设备与主机&#xff08;如电脑、嵌…