函数指针的用法

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

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…

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.计算下…

插入式微型机顶盒来了

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

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 接…

【数据可视化-11】全国大学数据可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

141.《mac m1安装mongodb详细教程》

文章目录 下载从官网下载安装包 下载后双击解压出文件夹安装文件名修改为 mongodb配置data存放位置和日志log的存放位置启动方式一方式二方式二:输入mongo报错以及解决办法 本人电脑 m2 pro,属于 arm 架构 下载 官网地址: mongodb官网 怎么查看自己电脑应该下载哪个版本,输入…

frameworks 之 Winscope 工具

frameworks 之 Winscope 工具 1. 手机端开启2. 加载追踪的文件2.1 Android12 3. 分析文件 Winscope 是一款 Web 工具&#xff0c;可以让用户在动画和转换期间和之后记录、重放和分析多个系统服务的状态。Winscope 将所有相关的系统服务状态记录在一个跟踪文件中。使用带有跟踪文…

【姿态估计实战】使用OpenCV和Mediapipe构建锻炼跟踪器【附完整源码与详细说明】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

cityhash–对字符串的哈希算法

原文地址&#xff1a;cityhash–对字符串的哈希算法 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 分享一个给字符串计算hash的开源库&#xff0c;谷歌出品。 源代码在&#xff1a;https://github.com/google/cityhash 可以自己下载&#x…

spring cloud微服务分布式架构

spring cloud微服务分布式架构 应用架构 单体应用架构&#xff1a;all in one 如&#xff1a;前端后端部署在一台服务器中 web应用和数据库放在同一台服务器中&#xff0c;只要服务器挂掉&#xff0c;应用就会终止。 分布式架构&#xff1a;将一个系统拆分为多个独立的组件&…