篇一、函数指针
函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。
函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数。
函数指针的声明方法
数据类型标志符 (指针变量名) (形参列表);
一般函数的声明为:
int func ( int x );
而一个函数指针的声明方法为:
int (*func) (int x);
前面的那个(*func)中括号是必要的,这会告诉编译器我们声明的是函数指针而不是声明一个具有返回型为指针的函数,后面的形参要视这个函数指针所指向的函数形参而定。
然而这样声明我们有时觉得非常繁琐,于是typedef可以派上用场了,我们也可以这样声明:
typedef int (*PF) (int x);
PF pf;
这样pf便是一个函数指针,方便了许多。当要使用函数指针来调用函数时,func(x)或者  (*fucn)(x) 就可以了,当然,函数指针也可以指向被重载的函数,编译器会为我们区分这些重载的函数从而使函数指针指向正确的函数。
例子:

typedef void (*PFT) ( char ,int );
void bar(char ch, int i)
{cout<<"bar "<<ch<<' '<<i<<endl;return ;
}
PFT pft;
pft = bar;
pft('e',91);

例子中函数指针pft指向了一个已经声明的函数bar(),然后通过pft来实现输出字符和整型的目的。
函数指针另一个作用便是作为函数的参数,我们可以在一个函数的形参列表中传入一个函数指针,然后便可以在这个函数中使用这个函数指针所指向的函数,这样便可以使程序变得更加清晰和简洁,而且这种用途技巧可以帮助我们解决很多棘手的问题,使用很小的代价就可获得足够大的利益(速度+复杂度)。

typedef void (*PFT) ( char ,int );
void bar(char ch, int i)
{cout<<"bar "<<ch<<' '<<i<<endl;return ;
}
void foo(char ch, int i, PFT pf)
{pf(ch,i);return ;
}
PFT pft;
pft = bar;
foo('e',12,pft);

上述例子我们首先利用一个函数指针pft指向bar(),然后在foo()函数中使用pft指针来调用bar(),实现目的。将这个特点稍加利用,我们就可以构造出强大的程序,只需要同样的foo函数便可以实现对不同bar函数的调用。

篇二、函数对象
前面是函数指针的应用,从一般的函数回调意义上来说,函数对象和函数指针是相同的,但是函数对象却具有许多函数指针不具有的有点,函数对象使程序设计更加灵活,而且能够实现函数的内联(inline)调用,使整个程序实现性能加速。
函数对象:这里已经说明了这是一个对象,而且实际上只是这个对象具有的函数的某些功能,我们才称之为函数对象,意义很贴切,如果一个对象具有了某个函数的功能,我们变可以称之为函数对象。
如何使对象具有函数功能呢,很简单,只需要为这个对象的操作符()进行重载就可以了,如下:

class A{
public:
int operator()(int x){return x;}
};
A a;
a(5);

这样a就成为一个函数对象,当我们执行a(5)时,实际上就是利用了重载符号()。
函数对象既然是一个“类对象”,那么我们当然可以在函数形参列表中调用它,它完全可以取代函数指针!如果说指针是C的标志,类是C++特有的,那么我们也可以说指针函数和函数对象之间的关系也是同前者一样的!(虽然有些严密)。当我们想在形参列表中调用某个函数时,可以先声明一个具有这种函数功能的函数对象,然后在形参中使用这个对象,他所作的功能和函数指针所作的功能是相同的,而且更加安全。
下面是一个例子:

class Func{
public:int operator() (int a, int b){cout<<a<<'+'<<b<<'='<<a+b<<endl;return a;}
};
int addFunc(int a, int b, Func& func)
{func(a,b);return a;
}
Func func;
addFunc(1,3,func);

上述例子中首先定义了一个函数对象类,并重载了()操作符,目的是使前两个参数相加并输出,然后在addFunc中的形参列表中使用这个类对象,从而实现两数相加的功能。
如果运用泛型思维来考虑,可以定一个函数模板类,来实现一般类型的数据的相加:

class FuncT{
public:template<typename T>T operator() (T t1, T t2){cout<<t1<<'+'<<t2<<'='<<t1+t2<<endl;return t1;}
};
template <typename T>
T addFuncT(T t1, T t2, FuncT& funct)
{funct(t1,t2);return t1;
}
FuncT funct;
addFuncT(2,4,funct);
addFuncT(1.4,2.3,funct);

大名鼎鼎的STL中便广泛的运用了这项技术,详细内容可参见候捷大师的一些泛型技术的书籍,不要以为函数对象的频繁调用会使程序性能大大折扣,大量事实和实验证明,正确使用函数对象的程序要比其他程序性能快很多!所以掌握并熟练运用函数对象才能为我们的程序加分,否则.......
如此看来,函数对象又为C++敞开了一道天窗,但随之而来的便是一些复杂的问题和陷阱,如何去蔽扬利还需要我们不断学习和探索。

C++中的函数指针和函数对象总结相关推荐

  1. 【转】回调函数,函数指针与函数对象

    原文出处:http://shudingbo.spaces.live.com/blog/cns!C33400475B08F157!423.entry?wa=wsignin1.0&sa=24651 ...

  2. c++函数指针和函数对象

    C++ 函数指针和函数对象 一. 导述 二.c++成员函数在内存中的存储方式 补1:静态数据和常量的区别: 三.函数指针 四.函数对象 一. 导述 博主认为,要想正确深入了解c++中的函数类型和函数指 ...

  3. C++函数指针、函数对象与C++11 function对象对比分析

    1.函数指针 函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址.函数指针主要由以下两方面的用途:调用函数和用作函数参数. 函数指针的 ...

  4. 函数指针 回调函数 面向对象风格的C语言

    这篇文章的所有代码都是用C实现的,这是由于C没有面向对象的特性,所以我希望用函数指针把C的结构体弄得有一点面向对象的感觉. 先介绍函数指针.回调函数,然后用C结合回调函数实现一个有面向对象风格的链表 ...

  5. c语言函数指针封装函数,C语言之函数指针、回调函数的使用

    一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...

  6. C语言指针数组,数组指针,函数指针,函数指针数组,函数指针数组的指针,回调函数

    C语言指针的一些知识点 指针 指针数组和数组指针的概念 函数指针,函数指针数组,函数指针数组的指针 回调函数 指针 1.指向对象的指针 int *p = new int(10); delete p; ...

  7. 函数指针作为函数参数及函数作为函数参数

    转载于:http://blog.csdn.net/vlily/article/details/7244682 转载于:http://blog.csdn.net/shengnan_wu/article/ ...

  8. 函数指针和函数指针数组及其应用

    1. 函数指针 先来看一个简单的例子: int a=3; void *p=&a; 这是一个基础的不能再基础的例子.相信学过指针的都能看得懂.P是一个指针,指向a.a 是一个整形变量.函数指针和 ...

  9. 回调函数 —— 借助中间通用函数(形参里有函数指针,实现函数注册)调用不同的回调函数 (多态/分层)

    回调函数传参:函数指针做函数参数(回调函数) 目录 背景 回调函数是实现函数分层且单向依赖的好办法,使用函数指针运行 struct结构体回调函数代码更清晰 简单理解回调函数 Demo 其他回调函数博文 ...

  10. 函数指针 和 函数指针数组 和 函数指针数组

    //先看一些函数指针的例子(吸纳了网上兄弟的方法) #include <stdio.h> void MyFun(int x); //这个申明也可写成:void MyFun( int ); ...

最新文章

  1. Linux下源码编译安装Python3
  2. Breadth-first Search(广度优先搜索)专题1
  3. 【火炉炼AI】机器学习032-用户之间相似度的计算
  4. pytorch 一些关于模型参数冻结的问题
  5. Gym 100733G No Negations
  6. AtomicReference
  7. Java 泛型 extends T 和 super T 详解
  8. “波斯公主选驸马”问题的理论分析和数学推导
  9. C语言基本入门英语单词,C语言基本入门英语单词.doc
  10. [javaSE] 基本类型(String相关)
  11. 微信小程序中自定义select下拉选项框
  12. 华为mate40营销之我见
  13. 电脑文件夹怎么批量重命名
  14. 苹果考虑推迟发布5G iPhone
  15. 网络推广员的工作职责,如何做好网络推广员
  16. 查看路由器拨号的宽带密码
  17. 【算法】一文详解贪心法
  18. 2023年城投债投资研究报告
  19. vm虚拟机安装lede旁路由_教你利用VMM虚拟机安装LEDE旁路由实现软路由超强功能的方法教程...
  20. java实现一个计算器:输入计算公式即可输出结果

热门文章

  1. SQL Server开发者Oracle快速入门
  2. wince国际化语言支持
  3. USB 3G驱动和USB HOST驱动加载
  4. TCP/IP协议分为哪四层,具体作用是什么。
  5. linux一切皆文件之tty字符设备(深入理解sshd创建pty的过程) (五)
  6. jquery-1 jquery几个小实例
  7. 前端每周清单半年盘点之 PWA 篇
  8. 《可穿戴创意设计:技术与时尚的融合》一一第2章 与可穿戴设备有关的故事...
  9. 互联网与CTI技术结合之商业应用
  10. “网络爸爸”的密码破解