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

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

举个 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 月,谷歌向世人发布了一款特别的机器学习专属…

linux 之间 copy 传输文件方法:ftp、samba、sftp、scp、sz/rz

不同的 Linux 之间 copy 文件通常有4种方法 1.ftp2.samba服务3.sftp4.scp 前三种方法都比较繁琐,最简单的方法就是 scp scp scp 本地用户名IP地址:文件名1 远程用户名IP地址:文件名2 [本地用户名IP地址:] 可以不输入,可能需要输入远程用户名所对应的密码.可能有…

Server.Transfer 和Response.Redirect 比较

作者:卡尔穆尔 原著:Developer.com 翻译:陈梦 如果你读过很多行业杂志和 ASP.NET 示例,你会发现,大多数人使用 Response.Redirect 将用户引导到另一个页面,而另一些人好像偏爱于神秘的 Server.Transfer&…

C++学习之路 | PTA(天梯赛)—— L2-010 排座位 (25分)(带注释)(并查集)(精简)

L2-010 排座位 (25分) 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。…

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

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

Template Method 和 Strategy 模式

Template Method 和 Strategy 模式

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 写的相…

实现了HTTP多线程下载

不是使用每连接一线程的技术,而是使用多路复用技术。作了一个分配算法。第一个HTTP Request返回取得ContentLength之后,如果使用多个连接下载,则需要一个分配算法,分配每个Request所对应的Range。分配的部分可能是一个连续的块&am…

C++学习之路 | PTA(天梯赛)—— L2-007 家庭房产 (25分)(带注释)(并查集)(精简)

L2-007 家庭房产 (25分) 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。 输入格式: 输入第一行给出一个正整数N(≤1000),随后N行,每行按下列格式给出一个…

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

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

C#中MSMQ消息队列测试疑问

今天我通过C#程序向某台机器发送MQ消息队列,并且已经将目标机器的消息队列设置消息存储限额无限制.我持续的把消息发送到目标机器上,发现只能发送1000条消息,其他的消息无法接收到!!!于是我尝试通过程序把消息队列的一些消息删除掉,最后发现消息队列又多了起来,但是到1000条的时…

Facade 和 Mediator 模式

Facade 和 Mediator 模式

C++学习之路 | PTA(甲级)—— 1114 Family Property (25分)(带注释)(并查集)(精简)

1114 Family Property (25分) This time, you are supposed to help us collect the data for family-owned property. Given each person’s family members, and the estate(房产)info under his/her own name, we need to know the size of each fami…

拥抱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的最大作用在于对知识的归档,可用于构建企业…