声明函数指针

#include<iostream>
using namespace std;
double a(double aa) { return aa; }
int main() {int aa = 9;
a(1.0); double(*fn)(double) = a;;
cout << a(1.0)<<endl;
cout << fn(1.0) << endl;
cout << fn << endl;
cout << &fn << endl;
cout << *fn << endl; }

  结果:

1
1
00821488
00F3FB70
00821488

回调函数

#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
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); }

  结果

9
81

  

回调函数还没懂应用在哪。

回调函数的限制

  向回调函数中所传递的信息超过了映射函数所能提供的参数。

解决

  函数指针在它们的效用中被限制,因为它们无法将函数与用户提供的数据一起提供。所以需要一种策略:它将回调函数与用户提供的数据封装成一个单独的单元。即函数类(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<iostream>
#include<string>
#include<cmath>
#include<algorithm>
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;
}

  结果

101
42

  

向映射函数传递函数对象

  使用函数对象的策略可以解决映射函数向回调函数传递额外信息的问题。

#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
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++通过使用模板函数来实现任何以函数对象作为参数的函数的方式来解决这个问题。原型如下

template <typename FunctionClass>
void callback(FunctionClass a, int g)

  示例

#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
class AddFunction {
public:
AddFunction(int k) { this->k = k; }
int operator()(int x) { return x + k; }
private:
int k;
};
template <typename FunctionClass>
void callback(FunctionClass a, int g) { cout << a(g) << endl; }
int main() {
AddFunction aa(8);
callback(aa,9);
}

  传递给callback的值可以是任何类型。当编译器试图展开callback模板函数时,如果该类型不能重载函数调用操作符以至于不能获得期望的参数,那么编译器就会报错。

c++程序设计基础、编程抽象与算法策略

声明函数指针、回调函数、函数对象------c++程序设计基础、编程抽象与算法策略的更多相关文章

  1. typedef void(*Fun) (void)是什么意思 函数指针(回调函数) 和函数对象总结

    https://blog.csdn.net/FreeApe/article/details/49124043 bool (*pf)(const string &,const string &a ...

  2. C语言笔记 08_函数指针&回调函数&字符串&结构体&位域

    函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: / ...

  3. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  4. C++ 类的多态三(多态的原理--虚函数指针--子类虚函数指针初始化)

    //多态的原理--虚函数指针--子类虚函数指针初始化 #include<iostream> using namespace std; /* 多态的实现原理(有自己猜想部分) 基础知识: 类 ...

  5. qsort中的函数指针,及函数解释

    函数指针有何用 函数指针的应用场景比较多,以库函数qsort排序函数为例,它的原型如下: void qsort(void *base,size_t nmemb,size_t size , int(*c ...

  6. selector函数指针回调机制

    selector可以叫做选择器,其实指的就是对象的方法,也可以理解为C语言里面的函数指针,在面向对象里面的对应概念. [self performSelector:@selector(Hidden) w ...

  7. 从成员函数指针生成可调用对象:function<>、mem_fn()和bind()

    我们知道,普通函数指针是一个可调用对象,但是成员函数指针不是可调用对象.因此,如果我们想在一个保存string的vector中找到第一个空string,不能这样写: vector<string& ...

  8. C++学习之普通函数指针与成员函数指针

    函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生.我最近也被问到了这方面的问题,心中 ...

  9. c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind

    一.符号修饰与函数签名 1.符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名.GCC的C++符号修饰方法如下: 1)所有符号都以_z开头 2)名字空间的名字 ...

随机推荐

  1. phantomjs 安装和试用

    准备学习casperjs, 发现官网上说  it’s an extremely useful companion to PhantomJS, 所以决定下把它下来试试.下载安装(win7)没什么可说的, ...

  2. 1126 Eulerian Path

    题意:若图是连通图,且所有结点的度均为偶数,则称为Eulerian:若有且仅有两个结点的度为奇数,则称为semi-Eulerian.现给出一个图,要我们判断其是否为Eulerian,semi-Eule ...

  3. thinkphp中的session的使用和理解!

    session的作用:session可以长时间的保存数据,不丢失. session的常用于: 1.登录,保存登录信息 2.保存购物车信息 3.保存验证码信息 定义session常量 define('W ...

  4. Altium Designer之多图纸设计

    Altium Designer的多图纸功能感觉比较方便:今天翻了下徐老师<Altium Designer 快速入门>里面关于多图纸设计的介绍,再参考了altium 网站的一些资料,算是摸熟 ...

  5. Unity3D的坑系列:打包Assetbundle丢失Shader问题(贴图显示不了)

    从Unity4.2开始,为了减少首包大小,不会默认将所有Shader引擎加到游戏程序中,据Unity技术支持人员所说,Unity会将Shader引擎打包到Assetbundle资源中,但是我测试发现不 ...

  6. 关于Oracle to_char()函数中的IW,WW 周别显示

    1)ww的算法为每年1月1日为第一周开始,date+6为每一周结尾 例如20050101为第一周的第一天,而第一周的最后一天为20050101+6=20050107 公式 每周第一天 :date + ...

  7. 7.solr学习速成之facet

    Facet 介绍   Facet 是 solr 的高级搜索功能之一 ,可以给用户提供更友好的搜索体验,在搜索关键字的同时 , 能够按照 Facet 的字段进行分组并统计.        比如你上淘宝, ...

  8. div+css 左右两列自适应高度 ,以及父级div也跟着自适应子级的高度(兼容各大浏览器)

    <style type="text/css" media="screen"> <!-- #main {width:500px;_height: ...

  9. 循序渐进Python3(十三) --1-- django之form表单

    在上一次的代码上做出进一步修改,使之能在页面上显示报错信息. views.py from django.shortcuts import render, HttpResponse from djang ...

  10. apache配置多个虚拟主机 localhost访问不了解决方案

    在httpd-vhosts.conf,重定向localhost <VirtualHost *:80>    ServerAdmin webmaster@dummy-host2.exampl ...