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

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥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++ 提供了三种运算符 ::* .* ->.用于定义和使用类成员函数指针

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


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

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

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值