成员函数指针作为参数是,静态函数和非静态函数的区别

成员函数指针作为参数时,静态函数和非静态函数的区别

举个 QT 的例子(没学过QT的也不要紧,这适用于学习C++的同学),当我有两个类,Teacher 类和 Student 类。现在有一个场景就是,Teacher 类会发出信号,然后 Student 类去处理。调用的是 connect 函数。

Teacher 类:
在这里插入图片描述

Student 类:
在这里插入图片描述

 	//创建一个老师对象this->tc = new Teacher(this);//创建一个学生对象this->st = new Student(this);//老师饿了,学生请客的连接connect(tc,&Teacher::hungry,st,&Student::treat);

注意这里,connect 函数的第二和第四个参数都是要传入函数指针。

但这时很多人就会产生一个疑问,传入函数指针,不就是传入函数的地址。那写 Teacher::hungry 不就是地址吗,为什么把 & 这个符号去掉就会报 error: call to non-static member function without an object argument 这个错误。

这是因为,在 C++ 中,Teacher::hungry 表示的是成员函数本身,而不是它的地址。
当你尝试直接传递 Teacher::hungry 作为函数参数时,编译器会认为你尝试调用一个非静态成员函数,但没有提供对象来调用它。这就是为什么会出现编译错误提示 “call to non-static member function without an object argument”。
而使用 &Teacher::hungry 的语法则表示获取 Teacher::hungry 成员函数的地址,并将这个地址作为成员函数指针进行传递。通过使用 & 运算符,你告诉编译器你要获取成员函数的地址,而不是直接调用它。

因此,在调用类的成员函数时,你应该使用 &ClassName::MemberFunction(类名::成员函数) 的语法来获得成员函数的地址,并将其传递给相应的函数或函数模板进行处理。这样可以确保编译器正确地解析成员函数指针,并且可以提供正确的对象来调用非静态成员函数。

如果,因为这里 Teacher 类中的 hungry 函数只是作为一个信号,取了 static 后传入 connect 函数会报错,所以就以 Student 类的 treat 函数来举例:
在这里插入图片描述
这里加了 static,相当于现在这个 treat 函数是静态函数。

在这里插入图片描述
所以可以直接这样传入,并不会报错,这是为什么呢?

如果 Student::treat 是一个静态成员函数,那么在将其传递给函数参数时,不需要使用 & 运算符获取其地址,也不需要提供对象来调用它。
静态成员函数是与类相关联的函数,而不是与类的实例(对象)相关联的。因此,你可以直接使用类名和作用域解析操作符 :: 来访问静态成员函数,而不需要提供对象。这样子直接传入,编译器自然会知道,现在指的是静态成员函数的指针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497150.shtml

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

相关文章

谷歌云TPU服务正式全面开放:「AlphaGo背后的芯片」进入商用化

来源:机器之心概要:作为科技巨头的谷歌早已把这种高度定制化产品应用在了自己的服务器中,而本周一,谷歌宣布其他公司马上也将可以享受新型芯片带来的计算服务了。2016 年 5 月,谷歌向世人发布了一款特别的机器学习专属…

波士顿动力新年视频第一发,机器人狗能为朋友开门了!

来源:36氪概要:波士顿动力公司的那只黄色机器人狗SpotMini,你还记得吗?波士顿动力公司的那只黄色机器人狗SpotMini,你还记得吗?它上一次亮相是在去年11月,当时它还在一片后院的草地上恣意奔跑。…

Makefile详解——从入门到精通

转自ChinaUnix,作者gunguymadman,陈皓。链接地址:http://www.chinaunix.net/jh/23/408225.html 陈皓 CSDN 博客:http://blog.csdn.net/haoel/article/details/2886 http://blog.csdn.net/ruglcc/article/details/7814546 写的相…

是时候不把智能手机叫做电话了:移动AI时代来临!

来源:EET电子工程专辑概要:全新的iPhone X集成了用于人脸识别的神经引擎,但这仅仅是一个开始。全新的iPhone X集成了用于人脸识别的神经引擎,但这仅仅是一个开始。嵌入式神经引擎和专用智能处理器在边缘设备上实现了人工智能(AI)&…

拥抱AI大趋势,ARM发布两款AI芯片架构

来源:量子位概要:ARM发布了两款针对移动终端的AI芯片架构,物体检测(Object Detection,简称OD)处理器和机器学习(Machine Learning,简称ML)处理器。今天,ARM发…

Ubuntu 安装 mysql、sqlite3、postgresql

NAVICAT 官网:http://www.navicat.com.cn/products NAVICAT16 PREMIUM NAVICAT16 :http://zzzzzz.me/post-73329.html Xmanager :https://www.xshellcn.com/ 1、Ubuntu 安装 mysql ubuntu上安装MySQL非常简单只需要几条命令就可以完成。 1…

牡丹园

其实从少林寺去洛阳非常近,当时想赶当天晚上的火车去另一个地方,所以从少林寺又回到郑州火车站,结果没有票,于是取消了。决定在郑州住一晚第二天去洛阳。 看到洛阳路边隔断种的都是这种植物,星星点点很是好看&#xff…

Singleton 和 Monostate 模式

Singleton 和 Monostate 模式 怎样才能使得两个实例表现得像一个对象呢?很简单,只要把所有的变量都变成静态变量即可。 public class Monostate {private static int itsX 0;public Monostate() {}public void setX(final int x) {itsX x;}public int…

十张图看懂未来大数据世界

作者:薄云借智来源:钱塘江大数据随着互联网云时代的来临,大数据与云计算就像一个硬币的正反两面,势必会影响到社会生活的方方面面,改变我们现有的规则和秩序。伴随着大数据与云计算产业的不断发展,未来到底…

MediaWiki初探:安装及使用入门

来源:http://blog.csdn.net/wangnan537/article/details/37743497 MediaWiki是著名的开源wiki引擎,全球最大的wiki项目维基百科(百科词条协作系统)是使用MediaWiki的成功范例,MediaWiki的最大作用在于对知识的归档,可用于构建企业…

科学释梦——意识窗口在记忆模块间的穿越

作者:谢平 中国科学院大学教授 唐代诗人李白曾说,“浮生若梦,为欢几何”,将人生喻为短暂的梦幻。有些人生如梦,有些梦若人生,还有梦想人生......梦——五彩缤纷,诡异神奇,我们每晚都…

linux 内核与用户空间通信之netlink使用方法

Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的P…

超级智能城市:更高质量的幸福社会

报告下载链接:https://pan.baidu.com/s/1oAmRK4U 密码:t9qb未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。由互联网进化论作者,计算机博士刘锋与中国科学院虚拟经济与数据科学研究中心石勇、刘颖教授创建…

python网络编程——IO多路复用之epoll

来源:http://www.cnblogs.com/maociping/p/5132583.html 1、内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/42643971博文并整理 首先我们来定义流的概念,一个流可以是文件,socket,pipe等可以进行…

高精度定位!“天地一体”基础设施助中国北斗在商用领域“弯道超车”

来源:上观概要:从2007年第一颗北斗导航卫星成功发射,到2018年2月12日第二十八、二十九颗卫星顺利升空进入预定轨道,北斗导航卫星系统的产业化步伐也日益加快。从2007年第一颗北斗导航卫星成功发射,到2018年2月12日第二…

2018全球技术展望报告

来源:199IT互联网数据中心概要:随着人工智能(AI)和其他技术的飞速发展,智能企业层出不穷,并正融入人们的生活。埃森哲(纽交所代码:ACN)最新发布的《埃森哲技术展望2018》…

Loguru:Python 日志终极解决方案

From:https://blog.csdn.net/kdl_csdn/article/details/121146354 1、日志的重要性 日志的作用非常重要,日志可以记录用户的操作、程序的异常,还可以为数据分析提供依据,日志的存在意义就是为了能够在程序在运行过程中记录错误&am…

全球机器换人排行榜!这八个国家遥遥领先

来源: 机器人创新生态概要:如今,世界各国都在进行机器换人,希望把人力劳动从低端工作岗位释放出来,制造业自动化水平越来越高,工厂利用工业机器人获得了更低的成本、更高的效率和更快的生产速度。人力成本的…

视频监控成AI芯片主战场,海康威视和大华股份占据半壁江山

来源:MEMS概要:图像和视频的人工智能处理,是目前AI芯片商业化前景最乐观的赛道,也是玩家们弯道超车的最佳机会。 图像和视频的人工智能处理,是目前AI芯片商业化前景最乐观的赛道,也是玩家们弯道超车的最佳机…

python 命令行 解析模块 optparse、argparse

optparse:https://docs.python.org/zh-cn/3/library/optparse.htmlargparse :https://docs.python.org/zh-cn/3/library/argparse.html3.2 版后已移除 optparse 模块,并且将不再继续开发;开发转至 argparse 模块进行。 ​1、argpa…