面试官问的问题是:Qt信号槽机制,你觉得可以用什么策略来取代? 因为signal-slot本身是一个顺序执行的过程,只有执行完slot之后,才会执行emit的下一条语句。其策略类似于函数调用,只不过由于其在QObject中架设了一个大的结构,这导致其执行效率不是很高,比直接的函数调用要慢10倍(忘记拿看的数据了)。平时在做项目时:如果可以我一般是用写纯虚接口的方式来替代signal-slot。   面试官又问:你有没有想过用函数指针来替代? 汗一个先,以前真没想过,而且函数指针用的也很少,今天专门补了一下这方面的知识,如下:

一:关于函数指针。

这个要区分于指针函数。

①:一个程序分为代码区和数据区,那么一个指针既可以指向在内存中存放数据的数据区,也可以指向存放代码的代码区。代码区中存放的就是各个函数。由此可见:我们可以用一个指针来指向某个函数。

②:在c语言中规定:一个函数总是占有一段连续的内存区,而函数名就是该函数所占内存区的首地址。   我们可以将该函数所占的这块内存区的首地址赋给一个指针变量,使该指针变量指向这个函数!   而后我们就可以使用这个指针变量来找到和调用该函数。

这种指向函数的指针变量就是“函数指针”

函数指针的一般定义形式是:

函数返回值类型 (*函数指针名)(函数形参列表)

例如:int (*pmax)(int,int); 这定义了一个指向含2个int形参,返回int值的函数指针。

比如:函数 int max(int a,int b)

我们可以这样调: int as = max(a,b);  //这是用函数名调

我们也可这样调: int(*pmax)(int,int);//使用函数指针来调用

pmax = max;

int as = (*pmax)(a,b);

注意事项:函数指针是指向函数的指针变量,它只能指向函数的入口处,而不能指向函数中间的某一条指令! 所以不能用*(pmax+1)这样的方式来执行函数的下一条指令。

二:signal-slot如何用函数指针来替代:

知道函数指针是怎么回事后,我们就可以来思考这个问题了。

其本质还是如何使用函数指针来实现函数调用,那明摆着就是需要把函数指针都存放起来,而后当调用的时候直接去这个存放处查找即可!我理解面试官的意思是这样的:

①:原本在一个类中定义一些slot,我们可以如下替代他们:首先定义一些普通的成员函数(原本他们应该是slot),而后另外再建一个void函数指针数组:将原本用作slot的函数的函数指针全部存进来。  这样:对于一个类而言:我们就是用一个函数指针数组来取代了slot。(同时用这个数组来区分一般的成员函数 和 类槽函数)。

②:对于connect()函数和signal,我没想出什么好办法,貌似只能用observer接口。直接去调函数指针数组中的对应函数。

我觉得关键在于:含有槽的类中:如果用函数指针来做的话,可以将原本的各个slot函数直接声明为private成员函数,而将这个数组对外开放为public,这样封装一下的比较好,也能体现其区分优势。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/NRC_DouNingBo/archive/2010/06/23/5689657.aspx

转载于:https://blog.51cto.com/seanyxie/1376006

面试题(Qt + 函数指针)相关推荐

  1. Qt类中使用函数指针数组

    声明函数指针类型 typedef void (MainWindow::*pFuns)(void); 函数声明 void test1(): void test2(): 数组定义并赋值 pFuns tes ...

  2. c c++ 函数内数组初值_C/C++函数指针与指针函数

    关于指针,前面文章C语言指针详解有过介绍,这里主要讨论函数指针和指针函数. 1 什么是指针? 定义:指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量; 上面一个 4GB 的内存可以存放 ...

  3. 成员函数指针与高性能的C++委托(三)

    委托(delegate) 和成员函数指针不同,你不难发现委托的用处.最重要的,使用委托可以很容易地实现一个Subject/Observer设计模式的改进版[GoF, p. 293].Observer( ...

  4. Qt智能指针--QSharedPointer

    文章目录 前言 QSharedPointer 值得一提 前言 Qt智能指针QSharedPointer 与 C++中的std::shared_ptr其作用是一样的,其应用范围比我们前面说到的QPoin ...

  5. 成员函数指针与高性能的C++委托(下篇)

    成员函数指针与高性能的C++委托(下篇) 撰文:Don Clugston (接中篇) 委托(delegate) 和成员函数指针不同,你不难发现委托的用处.最重要的,使用委托可以很容易地实现一个Subj ...

  6. 函数指针的用法以及用途详解

    在C++中,指针是一个核心的部分,常规的指针用法作者已经在另外一篇文章中有过详细介绍,这篇文章主要是针对函数指针进行讨论. 首先我们先来认识一下函数指针的概念,我们平时在写函数的时候,调用函数时总是以 ...

  7. 指针难点——数组指针、指针数组、函数指针、指针函数详解

    指针难点 1.指针 1.1指针数组和数组指针 2.右左法则 3.函数指针和指针函数 示例1 示例2 示例3(面试题) 1.指针 1.1指针数组和数组指针 指针数组是一个数组,数组里面存放的内容是指针 ...

  8. c语言 万能函数指针,C/C++编程笔记:C语言精华解析之void *指针,指针中的万能指针...

    什么是万能指针? 万能指针其实就是void *类型的指针,而void *指针一般被称为通用指针或叫泛指针.它是C语言关于纯粹地址的一种约定.当某个指针是void型指针时,所指向的对象不属于任何类型. ...

  9. C语言指针这一篇够了(一万二千字,包含指针与数组,函数指针等详解)

    目录 零.前言 一.指针的定义 二.指针类型的意义 1.指针类型决定了指针解引用时一次访问几个字节. 2.指针类型决定了指针加减整数时的步长 三.野指针 1.未初始化的指针 2.指针的越界访问 3.指 ...

  10. linux C 学习---函数指针

    我们经常会听到这样的说法,不懂得函数指针就不是真正的C语言高手.我们不管这句话对与否,但是它都从侧面反应出了函数指针的重要性,所以我们还是有必要掌握对函数指针的使用.先来看看函数指针的定义吧. 函数是 ...

最新文章

  1. pip更换国内镜像源
  2. Android 架构组件 - 让天下没有难做的 App
  3. r读取shape文件可视化_【R】提取 PCA 结果并利用 ggplot2 进行可视化
  4. arcgis python脚本实现从界面选择输入输出_ArcGIS Python脚本实现数据驱动页面的批量出图...
  5. 转载+记录数据增广的八种常用方式
  6. 浅谈各种数据库连接池
  7. 频谱知识图谱:面向未来频谱管理的智能引擎人工智能技术与咨询
  8. 自考计算机非笔试英语怎么考,自考中的非笔试课程是什么,怎么进行考核?
  9. Android8.1展讯平台之audio_policy_configuration.xml(四十二)
  10. 使用 tftp 无法向服务器上传文件问题解决
  11. 阿里P7架构师浅谈Java 的年薪 40W 是什么水平?
  12. X1000之LCD部分的翻译
  13. NUVOTON的IAP SFR
  14. 记使用Python+Pandas和Scipy库计算TRIMMEAN(截尾均值)的demo
  15. C++链表偶数在前,奇数在后的简单方法
  16. 十五万左右纯电SUV怎么选?奇瑞大蚂蚁是真香
  17. U盘数据被格式化怎么办,U盘格式化数据如何恢复?
  18. Android Audio常用音频工具和分析方法
  19. 使用RENREN-GENERATOR时遇到循环错误问题 Relying upon circular references is discouraged and they are prohibited
  20. 我的世界服务器不显示计分板,我的世界计分板教程 计分板指令详解

热门文章

  1. 黑苹果 无法运行xcode_Hackintosh (黑苹果) 折腾
  2. python 保存视频流_[宜配屋]听图阁
  3. struts html form提交加密,strutshtml:form标签有关问题  解决立即给分
  4. 如何给自己的电脑硬盘分区
  5. Kotlin — 适用于原生
  6. 【安装包】eclipseEE(IDE)
  7. L1-030 一帮一 (15 分)—团体程序设计天梯赛
  8. gcc编译c文件生成可执行文件
  9. RK3288_Android7.1调试RTC总结(一)
  10. xshell访问内网虚拟机