函数指针的用法

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

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.mzph.cn/web/65250.shtml

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

相关文章

DDcGAN_多分辨率图像融合的双鉴别条件生成对抗网络_y译文马佳义

摘要: 在本文中,我们提出了一种新的端到端模型,称为双鉴别条件生成对抗网络(DDcGAN),用于融合不同分辨率的红外和可见光图像。我们的方法建立了一个生成器和两个鉴别器之间的对抗博弈。生成器的目的是基于特…

springboot配置线程池

直接上代码 配置 定义一个配置类 创建一个springboot能扫描到的地方创建一个线程池配置类 配置信息 package com.example.demonew.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import or…

【君正T31开发记录】12.编译工具相关总结及介绍

移植交叉工具包的时候,发现这是很多工具的集合包;以及写makefile的时候,也需要了解下这些工具的作用及用法,这里总结记录一下常见的工具及相关用法。 g C编译器,用于编译C源代码文件,这个很常见&#xff0…

如何让面向应急管理的多智能体具备自主决策能力

现代应急管理面对的是复杂、多变、跨部门的灾害与事故场景——从自然灾害(洪水、地震、台风、火灾)到公共安全事件(疫情、重大安全事故),都需要在极短时间内进行快速响应和全局协同。传统的集中式指挥模式虽然有效&…

List-顺序表--2

目录 1、ArrayList 2、ArrayList构造方法 3、ArrayList常见方法 4、ArrayList的遍历 5、ArrayList的扩容机制 6、ArrayList的具体使用 6.1、杨辉三角 6.2、简单的洗牌算法 1、ArrayList 在集合框架中,ArrayList 是一个普通的类,实现了 List 接口…

lambda用法及其原理

目录 lambda形式lambda用法1.sort降序2.swap3.捕捉列表 习题解题 lambda形式 [capture-list](parameters)->return type{function boby}[capture-list]:[捕捉列表]用于捕捉函数外的参数,可以为空,但不能省略;(parameters) &am…

基于ASP.NET的动漫网站

一、系统架构与技术实现 系统架构:基于ASP.NET的MVC框架构建,实现网站的层次结构,使得网站更加易于维护和扩展。 技术实现:利用ASP.NET的技术特点,如强大的后端开发能力、丰富的UI控件等,结合前端技术如HT…

用 HTML5 Canvas 和 JavaScript 实现流星雨特效

最近在研究前端动画效果时,实现了一个超酷的流星雨特效,今天来和大家分享下具体实现过程。 1,整体实现思路 这个流星雨特效主要由 HTML、CSS 和 JavaScript 协同完成。HTML 搭建基础结构,CSS 负责页面样式设计,JavaScript 实现星星和流星的动态效果。 效果展示: 用 HTM…

AI中的神经元与权重矩阵之间的关系;神经元连接角度看行和列的意义

AI中的神经元与权重矩阵之间的关系 目录 AI中的神经元与权重矩阵之间的关系神经元连接角度看行和列的意义AI中的神经元概念 在人工智能领域,特别是神经网络中,神经元是基本的计算单元,它是对生物神经元的一种抽象模拟。就像生物神经元接收来自其他神经元的电信号,经过处理后…

Visual studio code编写简单记事本exe笔记

安装扩展cmake tools c/c c/c Extension pack CMakeLists.txt cmake_minimum_required(VERSION 3.20) project(NotepadApp)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)# Windows specific settings if(WIN32)set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)s…

Linux 35.6 + JetPack v5.1.4之编译 pytorch升级

Linux 35.6 JetPack v5.1.4之编译 pytorch升级 1. 源由2. 升级步骤1:获取二进制版本步骤2:安装二进制版本步骤3:获取torchvision步骤4:安装torchvision步骤5:检查安装版本 3. 使用4. 补充4.1 torchvision版本问题4.2 …

计算机网络--根据IP地址和路由表计算下一跳

一、必备知识 1.无分类地址IPV4地址网络前缀主机号 2.每个IPV4地址由32位二进制数组成 3. /15这个地址表示网络前缀有15位,那么主机号32-1517位。 4.地址掩码(子网掩码):所对应的网络前缀为1,主机号为0。 5.计算下…

欧几里得算法(简单理解版,非严格证明)

欧几里得算法用于求解两个整数的最大公约数,又称为辗转相除 依据的基本定理: GCD(a,b)GCD(a%b,b) 证明: 对于搞理论的人可能需要会严格证明,但是对于我们一般人而言,只要能理解其原理并记住即可,后者实际上…

插入式微型机顶盒来了

快科技1月6日消息,据国家广播电视总局今日消息,国家广播电视总局为首款以插入式微型机顶盒品类通过入网检测的设备颁发了入网认定证书。 这是插入式微型机顶盒批量部署进程中的又一大进展。同时,广播电视科学研究院依据行业标准建成了插入式…

lamda表达式

提示:文章 文章目录 前言一、背景在使用lambda的时候,有几个参数是可以直接省略的: 二、题目问题探究 总结 前言 前期疑问: 本文目标: lamda表达式 一、背景 看c科二的时候有看到lamda表达式,就再次看了…

XXL-RPC v1.8.1 | RPC服务框架

Release Notes 1、【安全】序列化安全性增强,默认开启package安全空间机制;2、【扩展】序列化扩展性增强,支持自定义序列化package白名单;3、【优化】序列化类型主动检测,提升问题定位效率;4、【能力】服务…

前端路由layout布局处理以及菜单交互(三)

上篇介绍了前端项目部署以及基本依赖的应用&#xff0c;这次主要对于路由以及布局进行模块化处理 一、 创建layout模块 1、新建src/layout/index.vue <template><el-container class"common-layout"><!-- <el-aside class"aside">&l…

Spring Boot(4)使用 IDEA 搭建 Spring Boot+MyBatis 项目全流程实战

文章目录 一、⚡搞个引言二、⚡开始搭建 Spring Boot 项目吧&#xff01;2.1 启动 IDEA 并创建新项目2.2 选择项目依赖2.3 完成项目创建 三、&#x1f4d8;项目结构剖析四、✍配置数据库连接五、✍ 创建 MyBatis 相关组件5.1 实体类&#xff08;Entity&#xff09;5.2 Mapper 接…

使用wujie搭建微前端应用及踩坑

线上演示地址&#xff1a;wujie-app 源码地址&#xff1a;https://github.com/Jiang-K-J/micro-app?tabreadme-ov-file &#xff08;如果觉您得有用&#xff0c;请帮忙点个小星星&#xff09; 主应用&#xff1a;vue2webpack 子应用&#xff1a;vue3vite 子应用&#xff1…