【Qt】成员函数指针

一、成员函数指针的本质

与普通函数指针的区别

// 普通函数指针
void (*funcPtr)() = &普通函数;// 成员函数指针
void (MyClass::*memberFuncPtr)() = &MyClass::成员函数;

绑定对象:成员函数指针必须与类的实例对象结合使用
隐含 this 指针:成员函数指针内部隐含了访问对象成员数据的上下文


二、完整语法解析

声明格式
返回类型 (类名::*指针变量名)(参数列表) [const];

示例 1:无参函数

void (Teacher::*teachSignal)() = &Teacher::hungry;

示例 2:带参数的函数

void (Student::*studySlot)(int hours) = &Student::learn;

示例 3:const 成员函数

QString (DataModel::*getData)() const = &DataModel::data;

三、核心使用场景

1. Qt 信号槽连接(Qt5+ 风格)
QObject::connect(sender对象指针, &发送者类::信号,  // 这里本质是成员函数指针receiver对象指针, &接收者类::槽函数
);

优势
• 编译时类型检查
• 自动参数类型匹配
• 不需要 SIGNAL()/SLOT()

2. 实现回调机制
class Button {
public:void onClick(void (User::*handler)()) {// 保存回调函数指针m_handler = handler;}void trigger(User* user) {(user->*m_handler)(); // 通过对象调用成员函数}private:void (User::*m_handler)();
};

四、操作成员函数指针

赋值与调用
class Calculator {
public:double add(double a, double b) { return a + b; }double mul(double a, double b) { return a * b; }
};// 定义成员函数指针类型
using MathOp = double (Calculator::*)(double, double);int main() {Calculator calc;// 赋值不同操作MathOp operation = &Calculator::add;double result = (calc.*operation)(3, 4); // 输出 7.0operation = &Calculator::mul;result = (calc.*operation)(3, 4); // 输出 12.0
}
在数据结构中使用
#include <map>class AudioPlayer {
public:void play() { /*...*/ }void pause() { /*...*/ }void stop() { /*...*/ }
};std::map<int, void (AudioPlayer::*)()> controlMap {{1, &AudioPlayer::play},{2, &AudioPlayer::pause},{3, &AudioPlayer::stop}
};// 使用示例
AudioPlayer player;
(player.*controlMap[1])(); // 执行 play()

五、特殊注意事项

1. 继承关系处理
class Base {
public:virtual void foo() { cout << "Base"; }
};class Derived : public Base {
public:void foo() override { cout << "Derived"; }
};// 成员函数指针支持多态
void (Base::*funcPtr)() = &Base::foo;
Derived obj;
(obj.*funcPtr)(); // 输出 "Derived"
2. 静态成员函数
class Logger {
public:static void writeLog() { /*...*/ } 
};// 静态成员函数使用普通函数指针
void (*logFunc)() = &Logger::writeLog;
3. 现代 C++ 的改进

使用 auto 简化声明:

auto funcPtr = &MyClass::memberFunction; // 自动推导类型

六、底层原理(扩展知识)

成员函数指针在内存中实际存储的是:
• 函数在类中的偏移量
• 虚函数表索引(如果是虚函数)
• 调整 this 指针的偏移量(多重继承时)

这种实现方式使得成员函数指针比普通函数指针占用更多内存(通常 2-3 个机器字长),具体细节由编译器实现决定。


七、Qt 中的典型应用

信号/槽参数匹配规则
// 参数类型必须严格匹配
void (Sender::*signal)(int) = &Sender::valueChanged;
void (Receiver::*slot)(int) = &Receiver::updateValue;QObject::connect(sender, signal, receiver, slot); // 正确// 以下会导致编译错误
void (Receiver::*wrongSlot)(QString) = &Receiver::wrongUpdate;
QObject::connect(sender, signal, receiver, wrongSlot); // 错误!参数类型不匹配

通过深入理解成员函数指针,可以更好地掌握 Qt 的信号槽机制以及 C++ 的面向对象特性。这种指针类型虽然语法略显复杂,但为类型安全的高阶抽象提供了坚实基础。

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

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

相关文章

通义万相2.1开源版本地化部署攻略,生成视频再填利器

2025 年 2 月 25 日晚上 11&#xff1a;00 通义万相 2.1 开源发布&#xff0c;前两周太忙没空搞它&#xff0c;这个周末&#xff0c;也来本地化部署一个&#xff0c;体验生成效果如何&#xff0c;总的来说&#xff0c;它在国内文生视频、图生视频的行列处于领先位置&#xff0c…

Linux——system V共享内存

共享内存区是最快的IPC(进程内通信)形式&#xff0c;不再通过执行进入内核的系统调用来传递彼此的数据 1.共享内存的原理 IPC通信的本质是让不同的进程先看到同一份资源&#xff0c;然后再进行通信&#xff0c;所以想要通过共享内存进行通信&#xff0c;那么第一步一定是让两个…

01 SQl注入基础步骤(数字、字符、布尔盲注、报错)

目录 1、SQL注入漏洞的概要 2、SQL注入的常规思路 3、数字型注入 4、字符型注入 5、布尔盲注 6、报错注入 1、SQL注入漏洞的概要 原理&#xff1a;通过用户输入的数据未严格过滤&#xff0c;将恶意SQL语句拼接到原始查询中&#xff0c;从而操控数据库执行非预期操作。 …

leetcode-sql数据库面试题冲刺(高频SQL五十题)

题目&#xff1a; 620.有趣的电影 表&#xff1a;cinema ------------------------ | Column Name | Type | ------------------------ | id | int | | movie | varchar | | description | varchar | | rating | float | ------------------------ id 是该表的主键(具有唯一值…

7.2 奇异值分解的基与矩阵

一、奇异值分解 奇异值分解&#xff08;SVD&#xff09;是线性代数的高光时刻。 A A A 是一个 m n m\times n mn 的矩阵&#xff0c;可以是方阵或者长方形矩阵&#xff0c;秩为 r r r。我们要对角化 A A A&#xff0c;但并不是把它化成 X − 1 A X X^{-1}A X X−1AX 的形…

在本地部署DeepSeek等大模型时,需警惕的潜在安全风险

在本地部署DeepSeek等大模型时&#xff0c;尽管数据存储在本地环境&#xff08;而非云端&#xff09;&#xff0c;但仍需警惕以下潜在安全风险&#xff1a; 1. 模型与数据存储风险 未加密的存储介质&#xff1a;若训练数据、模型权重或日志以明文形式存储&#xff0c;可能被物…

【javaEE】多线程(进阶)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

dify中使用NL2SQL

在 Dify 工作流中融入 NL2SQL&#xff08;自然语言转 SQL&#xff09;之能力&#xff0c;可依循如下步骤达成&#xff0c;借由 Dify 的模块化设计以及模型编排之功能&#xff0c;优化数据库查询之智能化交互&#xff1a; 一、环境准备与 Dify 部署 安装 Docker 与 Dify 务须确…

使用Everything搜索指定文件夹中的内容

直接路径搜索法 在 Everything 的搜索框中输入文件夹路径加空格&#xff0c;再输入要搜索的内容或文件名。如要在 D 盘的 “文档” 文件夹中搜索名为 “报告.docx” 的文件&#xff0c;可输入 “D:\ 文档 报告.docx”235。 高级搜索法 打开 Everything 软件&#xff0c;点击菜…

Java在小米SU7 Ultra汽车中的技术赋能

目录 一、智能驾驶“大脑”与实时数据 场景一&#xff1a;海量数据的分布式计算 场景二&#xff1a;实时决策的毫秒级响应 场景三&#xff1a;弹性扩展与容错机制 技术隐喻&#xff1a; 二、车载信息系统&#xff08;IVI&#xff09;的交互 场景一&#xff1a;Android Automo…

Vue开发中计算属性与方法调用之间的区别与联系

文章目录 一 概述二 核心区别三 联系四 使用原则 一 概述 在 Vue 中&#xff0c;计算属性&#xff08;computed&#xff09; 和 方法&#xff08;methods&#xff09; 都可以用于处理数据逻辑&#xff0c;但它们的核心区别在于 缓存机制 和 触发方式 。 计算属性示例&#xf…

【Unity】 HTFramework框架(六十一)Project窗口文件夹锁定器

更新日期&#xff1a;2025年3月7日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 Project窗口文件夹锁定器框架文件夹锁定自定义文件夹锁定限制条件 Project窗口文件夹锁定器 在Project窗口中&#xff0c;文件夹锁定器能够为任何文件夹加…

C语言:6.20字符型数据练习题

编写程序,输人一行数字字符(用回车结束),每个数字字符 的前后都有空格。 把这一行中的数字转换成一个整数。 例如,若输入(<CR>代表 Enter键):2 4 8 3<CR>则输出 整数:2483。 #include <stdio.h>int main() {char ch;int number 0;printf("请输入一行…

【软件工程】一篇入门UML建模图(状态图、活动图、构件图、部署图)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;软件开发必练内功_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

【C语言】数组篇

目录 引言一维数组数组的定义数组的初始化完全初始化部分初始化省略数组长度 数组元素的访问 多维数组二维数组的定义二维数组的初始化完全初始化部分初始化省略第一维长度 二维数组元素的访问 遍历数组元素遍历一维数组遍历二维数组 数组作为函数参数一维数组作为函数参数二维…

OpenCV视频解码性能优化十连击(实测帧率提升300%)

解密工业级视频处理优化方案&#xff01;从硬件加速到多线程榨干CPU/GPU性能&#xff0c;附RTSP流调优参数与内存泄漏排查技巧。 &#x1f527; 优化前准备 环境检测脚本 import cv2# 验证硬件加速支持 print("CUDA支持:", cv2.cuda.getCudaEnabledDeviceCount() &…

基于编译器特性浅析C++程序性能优化

最近在恶补计算机基础知识&#xff0c;学到CSAPP第五章的内容&#xff0c;在这里总结并且展开一下C程序性能优化相关的内容。 衡量程序性能的方式 一般而言&#xff0c;程序的性能可以用CPE&#xff08;Cycles Per Element&#xff09;来衡量&#xff0c;其指的是处理每个元素…

transformer模型介绍——大语言模型 LLMBook 学习(二)

1. transformer模型 1.1 注意力机制 **注意力机制&#xff08;Attention Mechanism&#xff09;**在人工智能中的应用&#xff0c;实际上是对人类认知系统中的注意力机制的一种模拟。它主要模仿了人类在处理信息时的选择性注意&#xff08;Selective Attention&#xff09;&a…

word甲烷一键下标

Sub 甲烷下标()甲烷下标 宏Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text "CH4".Replacement.Text "CHguoshao4".Forward True.Wrap wdFindContinue.Format False.MatchCase False.MatchWhole…

Dify 本地部署教程

目录 一、下载安装包 二、修改配置 三、启动容器 四、访问 Dify 五、总结 本篇文章主要记录 Dify 本地部署过程,有问题欢迎交流~ 一、下载安装包 从 Github 仓库下载最新稳定版软件包,点击下载~,当然也可以克隆仓库或者从仓库里直接下载zip源码包。 目前最新版本是V…