【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.pswp.cn/web/71865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71865.shtml
英文地址,請注明出處:http://en.pswp.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…