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

函数指针的用法

函數指標一些相關的用法和注意事項。以下將詳細說明:

1. 基本寫法:

這是最常見且明確的寫法,尤其在處理重載函數時非常有用。

void (GirlFriend::*girl2)(QString) = &GirlFriend::hungry;
  • void: 指標所指向的函數的回傳型別。
  • (GirlFriend::*): 表示這是一個指向 GirlFriend 類別成員函數的指標。
  • girl2: 指標變數的名稱。
  • (QString): 指標所指向的函數的參數列表。
  • &GirlFriend::hungry: 要指向的函數的位址。

2. 使用 typedefusing 進行簡化:

當需要多次使用同一種函數指標型別時,可以使用 typedef (C風格) 或 using (C++11引入) 來定義別名,使程式碼更簡潔易懂。

// 使用 typedef
typedef void (GirlFriend::*GirlFriendHungryFunc)(QString);
GirlFriendHungryFunc girl2 = &GirlFriend::hungry;

// 使用 using (更推薦)
using GirlFriendHungryFunc = void (GirlFriend::*)(QString);
GirlFriendHungryFunc girl2 = &GirlFriend::hungry;

3. 使用 auto (C++11引入):

在某些情況下,如果編譯器可以推斷出函數指標的型別,可以使用 auto 關鍵字來簡化宣告。但對於類別成員函數指標,通常還是建議明確寫出型別,以增加程式碼的可讀性。

auto girl2 = &GirlFriend::hungry; // 注意:此處 girl2 的型別仍然是 void (GirlFriend::*)(QString)

4. 指向靜態成員函數的指標:

指向靜態成員函數的指標與指向一般函數的指標類似,不需要指定類別名稱。

class MyClass {
public:
    static void myStaticFunction(int x);
};

void (*staticFuncPtr)(int) = &MyClass::myStaticFunction; // 注意:沒有 MyClass::*

5. 作為函數參數的函數指標:

函數指標可以作為函數的參數,允許將不同的函數傳遞給同一個函數。這在實現回調函數或策略模式時非常有用。

void executeFunction(void (*funcPtr)(int), int value) {
    funcPtr(value);
}

void myFunction(int x) {
    // ...
}

executeFunction(myFunction, 10);

6. 注意事項:

  • 成員函數指標需要物件: 成員函數指標需要一個物件實例才能呼叫。例如:

    GirlFriend gf;
    (gf.*girl2)("我想吃冰淇淋"); // 使用物件呼叫
    GirlFriend *gfPtr = new GirlFriend;
    (gfPtr->*girl2)("我想吃蛋糕"); // 使用指標呼叫
    
  • this 指標: 在類別成員函數中,可以使用 this 指標來呼叫其他成員函數,包括使用函數指標呼叫。

  • const 成員函數: 如果要指向 const 成員函數,函數指標的宣告也需要加上 const

    class MyClass {
    public:
        void myConstFunction() const;
    };
    
    void (MyClass::*constFuncPtr)() const = &MyClass::myConstFunction;
    
  • 虛擬函數: 函數指標也可以指向虛擬函數,但這會涉及到虛擬函數表 (vtable) 的查找,其行為與直接呼叫虛擬函數相同。

總結:

雖然新的 Qt 連接語法 (connect(sender, &Sender::signal, receiver, &Receiver::slot);) 大部分情況下都取代了手動使用函數指標的需求,但在處理重載訊號/槽,或是需要更底層的控制時,函數指標仍然非常有用。理解函數指標的不同寫法和用法,能讓你更靈活地運用 C++ 和 Qt。


http://www.kler.cn/a/469866.html

相关文章:

  • Kali系统(Debian 10.3) 遇到的问题
  • 25上软考中级【嵌入式系统设计师】易混淆知识点
  • 小白学Pytorch
  • 【网络安全设备系列】9、WAF(Web应用防火墙)
  • GoF23种设计模式 简介
  • 算法的学习笔记—不用常规控制语句求 1 到 n 的和
  • 反射能做什么
  • php Yii2 Excel导出图片资源到表格
  • WebAssembly(WASM) + Python: 构建高性能跨平台Web应用
  • 自定义校验注解
  • 文件上传漏洞 (网络安全)
  • Pytest 接口关联
  • 肘部法则确定聚类数
  • nginx: [emerg] host not found in upstream “host.docker.internal“
  • MPLS动态LSP配置实验
  • hot100_73. 矩阵置零
  • GitLab 创建项目、删除项目
  • 系统编程1.0-exec函数和exit()的使用
  • 《OpenCV 5.0.0-alpha:开启计算机视觉新篇章》
  • 在arm平台Euler系统上编译安装ffmpeg
  • [python]验证码识别库-DDDDOCR
  • CAM几何引擎简介
  • 目标检测算法-Picodet
  • 基于python大数据分析的高考志愿填报推荐系统实现
  • 决定系数(R²分数)——评估回归模型性能的一个指标
  • 【办公类-88-02】20250106批量读后感