声明函数指针、回调函数、函数对象------c++程序设计基础、编程抽象与算法策略
发布日期:2022-04-04 06:36:25
浏览次数:17
分类:博客文章
本文共 2435 字,大约阅读时间需要 8 分钟。
声明函数指针
#includeusing namespace std;double a(double aa) { return aa; }int main() {int aa = 9; a(1.0); double(*fn)(double) = a;; cout << a(1.0)<
结果:
110082148800F3FB7000821488
回调函数
#include#include #include #include using namespace std;void a(int t) { cout << t << endl; }void aa(int t) { cout << t*t << endl; }void callback(void(*fn)(int t),int g) { fn(g); } //映射函数int main() { callback(a, 9); callback(aa,9);}
结果
981
回调函数还没懂应用在哪。
回调函数的限制
向回调函数中所传递的信息超过了映射函数所能提供的参数。
解决
函数指针在它们的效用中被限制,因为它们无法将函数与用户提供的数据一起提供。所以需要一种策略:它将回调函数与用户提供的数据封装成一个单独的单元。即函数类(function class)(通过重载operateor()将对象本身作为方法)。这些类的实例称为函数对象(function object)或函子(functor)。
函数对象的简单例子
例如,函数对其参数值加1:
int add1(int x) {return x+1;}
现在改需求了,给定一个整型常量k,对参数值加k。
int addk(int x) {return x+k;}
k可为任意整数。你不可能实现与k相同数目的函数。你需要创建一个封装两个构件的函数类:一个变量记录k的值,另一个重载operator(),以便给操作符向其参数增加存储的k值。示例
#include#include #include #include using namespace std;class AddFunction {public: AddFunction(int k) { this->k = k; } int operator()(int x) { return x + k; }private: int k;};int main() { AddFunction add1 = AddFunction(1); AddFunction add17 = AddFunction(17); cout << add1(100) << endl; cout << add17(25) << endl;}
结果
10142
向映射函数传递函数对象
使用函数对象的策略可以解决映射函数向回调函数传递额外信息的问题。
#include#include #include #include using namespace std;class AddFunction {public: AddFunction(int k) { this->k = k; } int operator()(int x) { return x + k; }private: int k;};void callback(AddFunction a, int g) { cout << a(g) << endl; }int main() { AddFunction aa(8); callback(aa,9);}
结果
17
编写以函数作为参数的函数
1、函数指针
void callback(void(*fn)(int t),int g) { fn(g); }
2、函数对象
c++通过使用模板函数来实现任何以函数对象作为参数的函数的方式来解决这个问题。原型如下
templatevoid callback(FunctionClass a, int g)
示例
#include#include #include #include using namespace std;class AddFunction {public: AddFunction(int k) { this->k = k; } int operator()(int x) { return x + k; }private: int k;};template void callback(FunctionClass a, int g) { cout << a(g) << endl; }int main() { AddFunction aa(8); callback(aa,9);}
传递给callback的值可以是任何类型。当编译器试图展开callback模板函数时,如果该类型不能重载函数调用操作符以至于不能获得期望的参数,那么编译器就会报错。
c++程序设计基础、编程抽象与算法策略
转载地址:https://www.cnblogs.com/l2017/p/8322385.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月09日 11时28分30秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
AcWing - 高精度乘法(大数乘法)
2019-04-28
AcWing - 高精度除法(大数除法)
2019-04-28
AcWing - 前缀和(前缀和)
2019-04-28
AcWing - 子矩阵的和(二维前缀和)
2019-04-28
AcWing - 差分(一维差分)
2019-04-28
AcWing - 最长连续不重复子序列(双指针)
2019-04-28
AcWing - 数组元素的目标和(双指针)
2019-04-28
AcWing - 区间和(离散化&前缀和)
2019-04-28
AcWing - 区间合并(贪心)
2019-04-28
AcWing - 单链表(模拟)
2019-04-28
AcWing - 双链表(模拟)
2019-04-28
AcWing - KMP字符串(KMP)
2019-04-28
来一个总结吧
2019-04-28
有趣的句子
2019-04-28
每天一道 python 面试题 - Python中的元类(metaclass) 详细版本
2019-04-28
Scrapy(6)Item loader 加载器详解
2019-04-28
每日一道python面试题 - Python的实例,类和静态方法揭秘
2019-04-28
今日金融词汇---新股新债前面的N,是什么?
2019-04-28
每日一道python面试题 - Python的实例,类和静态方法揭秘
2019-04-28
原创专辑来了
2019-04-28