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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【洛谷算法题】P4414-[COCI2006-2007#2] ABC【入门2分支结构】Java题解

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P4414-[COCI2006-2007#2] ABC【入门2分支结构】Java题解🌏题目描述&a…

股市中的Santa Claus Rally (圣诞节行情)

圣诞节行情 Santa Claus Rally Santa Claus Rally 是指 12 月 25 日圣诞节前后股市的持续上涨这样一个现象。《股票交易员年鉴》的创始人 Yale Hirsch 于 1972 年创造了这个定义,他将当年最后五个交易日和次年前两个交易日的时间范围定义为反弹日期。 根据 CFRA Re…

双向可控硅触发电路图大全

双向可控硅触发电路图一: 为了提高效率,使触发脉冲与交流电压同步,要求每隔半个交流电的周期输出一个触发脉冲,且触发脉冲电压应大于4V,脉冲宽度应大于20us.图中BT为变压器,TPL521-2为光电耦合器&#xff…

靠谱免费的MAC苹果电脑杀毒软件CleanMyMac X2024

您是否曾经为Mac电脑的性能下降、存储空间不足而烦恼?是否希望有一个简单而高效的解决方案来优化您的Mac系统?那么,我向您介绍一款非常出色的工具:CleanMyMac X。它能够轻松处理这些问题,并让您的Mac恢复到最佳状态。 …

多款双向晶闸管调光电路

双向晶闸管调光控制电路原理图 交流调压是把不变的交流电压变换成有效值可调的交流电压,用一只双向晶闸管代替两只反并联晶闸管,可使电路大大简化。被广泛应用于工业加热、灯光控制、感应电动机的调速以及电解电镀的交流侧调压等场合。 用双向晶闸管组…

shell 函数的详细用法及应用

简介 本篇文章从函数的特点开始介绍 ,教会小白如何定义函数,学习函数中的各种方法,最后整理了一些实际的应用场景来帮助大家学会如何灵活应用。 文章目录如下: 1. 了解什么是shell函数 1.1. 函数的历史 1.2. 函数有哪些特点 2…

常见的Ubuntu命令30条(二)

Ubuntu命令是指在Ubuntu操作系统中用于执行各种任务和操作的命令行指令。这些命令可以用于管理系统、配置网络、安装软件、浏览文件等。Ubuntu命令通常在终端(Terminal)应用程序中输入并执行。 history:显示命令行历史记录。grep&#xff1a…

Python - 深夜数据结构与算法之 Graph

目录 一.引言 二.图的简介 1.Graph 图 2.Undirected graph 无向图 3.Directed Graph 有向图 4.DFS / BFS 遍历 三.经典算法实战 1.Num-Islands [200] 2.Land-Perimeter [463] 3.Largest-Island [827] 四.总结 一.引言 Graph 无论是应用还是算法题目在日常生活中比较…

YOLO算法改进7【中阶改进篇】:主干网络C3替换为轻量化网络MobileNetV3

解决问题:YOLOv5主干特征提取网络采用C3结构,带来较大的参数量,检测速度较慢,应用受限,在某些真实的应用场景如移动或者嵌入式设备,如此大而复杂的模型时难以被应用的。首先是模型过于庞大,面临…

reactor的原理与实现

网络模型 前情回顾服务器模型 Reactor和 ProactorReactor模型Proactor模型同步I/O模拟Poractor模型Libevent,libev,libuv优先级事件循环线程安全 前情回顾 网络IO,会涉及到两个系统对象:   一个是用户空间调用的进程或线程   …

企业计算机服务器中了babyk勒索病毒怎么办,babyk勒索病毒解密数据恢复

在数字化的今天,网络安全威胁不断增加,给企业的生产生活带来了严重影响,使得企业不得不重视数据安全问题。近日,云天数据恢复中心接到企业求助,企业的计算机服务器中了babyk勒索病毒,导致企业所有计算机系统…

【开源】基于Vue+SpringBoot的贫困地区人口信息管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 人口信息管理模块2.2 精准扶贫管理模块2.3 特殊群体管理模块2.4 案件信息管理模块2.5 物资补助模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 人口表3.2.2 扶贫表3.2.3 特殊群体表3.2.4 案件表3.2.5 物资补助表 四…

CleanMyMac X2024解锁完整官方版本

作为一款知名的系统清理软件,深受广大用户们的喜爱。它操作简洁,能够实现一键清理,包括但不仅限于清理语言文件、缓存文件、日志文件以及ISO图片缓存等。同时对于用户们比较头疼的iTunes垃圾,也能做到真正地清洁,不留文…

Hadoop(2):常见的MapReduce[在Ubuntu中运行!]

1 以词频统计为例子介绍 mapreduce怎么写出来的 弄清楚MapReduce的各个过程&#xff1a; 将文件输入后&#xff0c;返回的<k1,v1>代表的含义是&#xff1a;k1表示偏移量&#xff0c;即v1的第一个字母在文件中的索引&#xff08;从0开始数的&#xff09;&#xff1b;v1表…

学习在UE中通过Omniverse实现对USD文件的Live-Sync(实时同步编辑)

目标 前一篇 学习了Omniverse的一些基础概念。本篇在了解这些概念的基础上&#xff0c;我想体验下Omniverse的一些具体的能力&#xff0c;特别是 Live-Sync (实时同步) 相关的能力。 本篇实践了使用Omniverse的力量在UE中建立USD文件的 Live-Sync 编辑。由于相关的知识我是从…

Settings中电池选项-Android13

Settings中电池选项-Android13 1、设置中界面2、电池计算2.1 充电时间计算2.1.1 BatteryUsageStats获取2.1.2 BatteryStatsImpl计算 2.2 电池剩余使用时间2.2.1 Estimate获取2.2.2 BatteryStatsImpl计算 3、电池信息来源4、命令模拟* 日志 [电池]Android 9.0 电池未充电与充电字…

JVM介绍

程序计数器&#xff1a; 程序计数器属于线程的私有内存区域&#xff0c;记录当前线程的运行位置&#xff0c;以供多线程运行时上下文切换&#xff0c;字节码解释器通过程序计数器的增减来执行顺序分支循环等结构。独立于堆之外&#xff0c;因此程序计数器是唯一不会导致OutOfMe…

大数据深度解析NLP文本摘要技术:定义、应用与PyTorch实战

文章目录 大数据深度解析NLP文本摘要技术&#xff1a;定义、应用与PyTorch实战1. 概述1.1 什么是文本摘要&#xff1f;1.2 为什么需要文本摘要&#xff1f; 2. 发展历程2.1 早期技术2.2 统计方法的崛起2.3 深度学习的应用2.4 文本摘要的演变趋势 3. 主要任务3.1 单文档摘要3.2 …

SLAM算法与工程实践——SLAM基本库的安装与使用(6):g2o优化库(4)构建g2o的边

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址&#xff1a; SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

[原创][R语言]股票分析实战[4]:周级别涨幅趋势的相关性

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…