【C/C++】类成员函数指针 定义 使用方法

news2025/6/17 1:13:30

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 一、为什么要使用类函数指针
  • 二、类函数指针定义
  • 三、全局函数 和类成员函数区别
  • 总结

一、为什么要使用类函数指针

类成员函数指针是指指向类中成员函数的指针

调用函数的两种方式:

  • 通过函数名直接调用
  • 通过函数指针间接调用

通过函数指针调用的好处:真正的函数指针可以将实现同一功能的多个模块统一起来标识,使系统结构更加清晰,后期更容易维护。

总结为:便于分层设计、利于系统抽象、降低耦合度以及使接口与实现分开,提高代码的复用性、扩展性。

在这里插入图片描述

二、类函数指针定义

普通函数指针是这样定义和使用的:

void fun(int v)
{
	cout << __FUNCTION__ << v << endl;
}
int main()
{
	void (*p_fun)(int) = &fun;
	(*p_fun)(10);
	return 0;
}

在这里插入图片描述

类函数指针又如何定义呢?

先定义一个CTest


class CTest
{
public:
	void fun(/* CTest const * this    */int v)
	{
		cout << __FUNCTION__ << v << endl;
	}
};

根据普通的函数指针,类函数指针应该是如下这样定义

	void (*p_fun2)(int) = &CTest::fun;

但是编译器报错为:

在这里插入图片描述

根据报错,可以看出类函数指针p_fun2缺少CTest::,与普通的函数指针定义不同


类函数指针应该这样定义:

	void (CTest:: * p_fun2)(int) = &CTest::fun;
	//定义类成员函数指针并初始化,注意&和类名作用域 都不能省略

其中::* 是C++提供的整体操作符,用于定义类成员函数指针


创建对象使用该类成员函数指针调用函数时又出现了问题:

在这里插入图片描述

类函数指针与普通的函数指针调用不同

通过函数指针间接调用成员函数应该如下使用:

	CTest test;
	(test.*p_fun2)(20);		//普通对象通过指针调用类成员函数
	
	CTest*pTst = new CTest;
	(pTst->*p_fun2)();		//指针对象通过指针调用类成员函数

其中 .* 也是整体操作符,用于调用类成员函数指针指向的函数

三、全局函数 和类成员函数区别

  • 作用域不同

  • 类成员函数有隐藏的this指针作为第一个参数,全局函数没有this指针参数

总结

类成员函数编译器会默认加上一个隐藏的参数:this指针

所以定义类成员函数的指针与普通的函数指针肯定会有所区别:

C++ 提供了三种运算符 ::* .* ->.用于定义和使用类成员函数指针

定义类成员函数指针时,注意&类名作用域不能省略


使用指针间接调用函数的优点:

  • 调用便于分层设计、利于系统抽象、降低耦合度
  • 使接口与实现分开
  • 提高代码的复用性、扩展性。

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

使用conda虚拟环境,Jupyter Notebook 链接不上 kernel

1&#xff0c;检查 ipykernel 和 ipython 是否一致 输入pip list 或者conda list检查一下相应库的版本是不一致 不一致的话&#xff0c;可以更新这两个库的版本&#xff1a;pip install --upgrade 库名 2&#xff0c;看控制台的报错&#xff0c;如果是报404&#xff0c;内核找不…

leetcode 145. 二叉树的后序遍历

2023.6.24 继上一题前序遍历&#xff0c;这道后序遍历就很容易了&#xff0c;把递归的顺序稍微改一下就行。 递归法&#xff1a; class Solution { public:void travelsal(TreeNode* cur , vector<int>& ans){if(cur nullptr) return;travelsal(cur->left , an…

如何设计真正高性能高并发分布式系统?

1 、引子 软件复杂性来源于几个方面&#xff1a;高并发高性能、高可用、可扩展、低成本、低规模、可维护、安全等。架构演化、发展都是为了试图降低复杂性&#xff1a; 高并发、高性能&#xff1a;互联网系统特点&#xff0c;用户量大&#xff0c;请求量大&#xff0c;高并发高…

NLP学习笔记(二)

文章目录 &#xff08;一&#xff09;负采样&#xff08;二&#xff09;GloVe1.带全局语料库的跳元模型2.GloVe模型3.问题4.跳元模型与GloVe模型的比较 &#xff08;三&#xff09;问题1.参数初始化2.梯度下降3.下游任务4.句法信息5.似然估计6.词向量表示 &#xff08;一&#…

MySQL基础篇(day04,复习自用)

MySQL第四天 单行函数内容练习 聚合函数内容练习 单行函数 内容 #第七章 单行函数 SELECT ABS(-123),ABS(32),SIGN(-23),SIGN(43),PI(),CEIL(32.32),CEILING(-43.23),FLOOR(32.32), FLOOR(-43.23),MOD(12,5) FROM DUAL;#取随机数 SELECT RAND(),RAND(),RAND(10),RAND(10),RAND…

亚马逊开店卖什么好呢?有哪些热销产品推荐?

现如今提起跨境电商&#xff0c;人们首先会想到亚马逊平台&#xff0c;作为利润的核心&#xff0c;其发展与优势都是有目共睹的&#xff0c;所以引来了大批的创业者前往亚马逊开店&#xff0c;然而在亚马逊开店后&#xff0c;首先想到的问题就是卖什么产品好&#xff1f;什么产…

推荐一款轻量级全栈式开源测试平台!

1、RunnerGo介绍 今天给大家介绍一个好用的测试平台&#xff1a;RunnerGo&#xff08;开源&#xff09;。RunnerGo是一款轻量级、全栈式的测试平台&#xff0c;支持接口管理、场景管理、性能测试、自动化测试等功能。与市面上的性能测试工具不同的是RunnerGo基于go语言研发&am…

三元表达式空指针问题

三元表达式空指针问题 问题描述&#xff1a; 如下代码标红处出现空指针异常&#xff1a; 测试及定位问题&#xff1a; 情景一&#xff1a;将num赋值为20&#xff0c;将flag赋值为true 正常输出10 情景二&#xff1a;将num赋值为null&#xff0c;将flag赋值为true 此时可以看到…

域渗透——vCenter安装及使用

简介 VMware vCenterServer 提供了一个可伸缩、可扩展的平台&#xff0c;为 虚拟化管理奠定了基础。VMware vCenter Server&#xff08;以前称为 VMware VirtualCenter&#xff09;&#xff0c;可集中管理 VMware vSphere 环境&#xff0c;与其他管理平台相比&#xff0c;极大…

C妈妈直播监控大屏页面--formDataSign参数逆向分析

内容仅供参考学习 欢迎朋友们V一起交流&#xff1a; zcxl7_7 详情请看专栏中的文章

【单片机】STM32单片机读取旋转编码器,TIM定时器编码器模式捕获,程序

文章目录 旋转编码器介绍主程序逻辑直接检测用外部中断检测下降沿定时器直接解码旋转编码器STM32中文参考手册V10.pdf定时器的编码器模式TIM2定时器编码器程序TIM3定时器编码器程序TIM4定时器编码器程序 旋转编码器介绍 旋转编码器简单来说&#xff0c;就是会输出2个PWM&#…

d2l_第八章学习_现代卷积神经网络

参考&#xff1a; d2l x.1 AlexNet 研究人员认为&#xff1a; 更大更干净的数据集或是稍加改进的特征提取方法&#xff0c;比任何学习算法带来的进步大得多。认为特征本身应该被学习&#xff0c;即卷积核参数应该是可学习的。创新点在于GPU与更深的网络&#xff0c;使用ReLU…

问题收藏夹——使用mybatisPlusJoin报 NoSuchPropertyException错误

出现问题代码&#xff1a; 报错&#xff1a; 解决方法&#xff1a; MPJLambdaQueryWrapper 类有问题&#xff0c;应该用MPJLambdaWrapper&#xff0c;去看了作者官网&#xff0c;发现已经没有这个类的用法了&#xff0c;但是还能用这个类&#xff08;Copilot直接给我补全这个…

SNMP 计算机网络管理 实验2(三) SNMP服务与常用网管命令之任务五:查看端口流量及实验小结

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

人工智能 --- 吉布斯采样

贝叶斯网络如下图所示&#xff0c;包含 4 个随机变量&#xff0c;每个变量都只有表示是否的两个值。请用吉布斯采样方法回答以下问题。 假设观察到 &#x1d445; &#x1d45f;, 初始化样本中其他变量的赋值为 &#x1d436; &#x1d450;, &#x1d446; −&#x1d460…

四、深度学习的计算

文章目录 前言一、层和块1.1 自定义块1.2 顺序块1.3 在前向传播函数中执行代码1.4 效率问题1.5 小结 二、参数管理2.1 参数访问2.1.1 目标参数2.1.2 访问所有参数2.1.3 从嵌套块中收集参数 2.2 参数初始化2.2.1 内置初始化2.2.2 自定义初始化2.2.3 参数绑定 三、延后初始化四、…

低功耗蓝牙OM6621EM 兼容Nordic 51系列2.4G私有协议

OM6621EM是一个功率优化的系统(SOC).解决蓝牙低功耗和专有的2.4 ghz应用。它集成了一个高具有蓝牙基带和丰富外设的低功耗射频收发器I0扩展。OM6621EM还集成了电源管理单元(PMU)来提供高效的电源管理。它的目标是2.4GHz低功耗蓝牙系统&#xff0c;专有的2.4 ghz系统&#xff0c…

easyX库其他函数(注释版)

本篇是easyX库系列正文最后一篇&#xff0c;依旧是有几个很有价值的函数&#xff0c;我不补充了几个例子&#xff0c;对easyX库中的部分code例子做了修改。 0.其它函数概览 函数或数据类型描述GetEasyXVer获取当前EasyX库的版本信息。BeginBatchDraw开始批量绘图。EndBatchDr…

Java Web HTMLCSS(1)23.6.29

HTML&CSS 1&#xff0c;HTML 1.1 介绍 HTML 是一门语言&#xff0c;所有的网页都是用HTML 这门语言编写出来的&#xff0c;也就是HTML是用来写网页的&#xff0c;像京东&#xff0c;12306等网站有很多网页。 这些都是网页展示出来的效果。而HTML也有专业的解释 HTML(Hy…

Pycharm中打开HTML文件报错:Windows 找不到文件‘chrome‘

问题现象&#xff1a; Pycharm中&#xff0c;打开HTML文件&#xff0c;选择chrome浏览器打开时&#xff0c;报错&#xff1a;Windows 找不到文件’chrome’。请确定文件名是否正确后&#xff0c;再试一次。但实际上你的电脑上是安装了Chrome浏览器的。 解决方案&#xff1a; 原…