创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>?<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
?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++ 提供了三种运算符 ::*
.*
->.
用于定义和使用类成员函数指针
定义类成员函数指针时,注意&
和类名作用域
不能省略
使用指针间接调用函数的优点:文章来源:https://uudwc.com/A/1Y0mE
- 调用便于分层设计、利于系统抽象、降低耦合度
- 使接口与实现分开
- 提高代码的复用性、扩展性。
文章来源地址https://uudwc.com/A/1Y0mE
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |