1.函数指针

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

函数指针的声明方法

数据类型标志符 (指针变量名) (形参列表); 
一般函数的声明为:  
int func ( int x ); 
而一个函数指针的声明方法为: 
int (*func) (int x); 
前面的那个(*func)中括号是必要的,这会告诉编译器我们声明的是函数指针而不是声明一个具有返回型为指针的函数,后面的形参要视这个函数指针所指向的函数形参而定。

函数指针例子

   #include<iostream>
#include<cstdlib>
#include<vector>
using namespace std;int AddFunc(int a, int b)
{  return a + b;
}
int main(){int (*Add1)(int a,int b);int (*Add2)(int a,int b);Add1 = &AddFunc;Add2 = AddFunc;//两种函数指针赋初值方法,可以加取地址符也可以不加cout << (*Add1)(3,2)<<endl; // 5cout<<Add1(3,2)<<endl;//输出可以加*,也可以不加system("pause");return 0;
}

2.函数对象

C++函数对象实质上是操作符重载,实现了对()操作符的重载。C++函数对象不是函数指针。但是,在程序代码中,它的调用方式与函数指针一样,后面加个括号就可以了。

函数对象例子:

int AddFunc(int a, int b)
{  return a + b;
}
class Add{
public:const int operator()(const int a,const int b){return a+b;}
};
int main(){//函数指针int (*Add1)(int a,int b);int (*Add2)(int a,int b);Add1 = &AddFunc;Add2 = AddFunc;//两种函数指针赋初值方法cout << (*Add1)(3,2)<<endl; // 5cout<<Add1(3,2)<<endl;//输出可以加*,也可以不加//函数对象Add addFunction;cout<<addFunction(2,3)<<endl;system("pause");return 0;
}

函数对象与函数指针比较

函数对象可以把附加对象保存在函数对象中是它最大的优点。它的弱势也很明显,它虽然用起来象函数指针,但毕竟不是真正的函数指针。在使用函数指针的场合中,它就无能为力了。例如,你不能将函数对象传给qsort函数!因为它只接受函数指针。另外,C++函数对象还有一个函数指针无法匹敌的用法:可以用来封装类成员函数指针。

3.C++11 function函数对象

介绍:类模版std::function是一种通用、多态的函数封装。std::function可以对任何可以调用的实体进行封装,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。 
通常std::function是一个函数对象类,它包装其它任意的函数对象,被包装的函数对象具有类型为T1, …,TN的N个参数,并且返回一个可转换到R类型的值。std::function使用 模板转换构造函数接收被包装的函数对象;特别是,闭包类型可以隐式地转换为std::function。 
也就是说,通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。一切变的简单粗暴。

C++11 function对象示例:

#include <functional>
#include <iostream>
using namespace std;std::function< int(int)> Functional;// 普通函数
int TestFunc(int a)
{return a;
}// Lambda表达式
auto lambda = [](int a)->int{ return a; };// 仿函数(functor)
class Functor
{
public:int operator()(int a){return a;}
};// 1.类成员函数
// 2.类静态函数
class TestClass
{
public:int ClassMember(int a) { return a; }static int StaticMember(int a) { return a; }
};int main()
{// 普通函数Functional = TestFunc;int result = Functional(10);cout << "普通函数:"<< result << endl;// Lambda表达式Functional = lambda;result = Functional(20);cout << "Lambda表达式:"<< result << endl;// 仿函数Functor testFunctor;Functional = testFunctor;result = Functional(30);cout << "仿函数:"<< result << endl;// 类成员函数TestClass testObj;Functional = std::bind(&TestClass::ClassMember, testObj, std::placeholders::_1);result = Functional(40);cout << "类成员函数:"<< result << endl;// 类静态函数Functional = TestClass::StaticMember;result = Functional(50);cout << "类静态函数:"<< result << endl;return 0;
}

对于各个可调用实体转换成std::function类型的对象,上面的代码都有,运行一下代码,阅读一下上面那段简单的代码。总结了简单的用法以后,来看看一些需要注意的事项:

关于可调用实体转换为std::function对象需要遵守以下两条原则: 
(1)转换后的std::function对象的参数能转换为可调用实体的参数; 
(2)可调用实体的返回值能转换为std::function对象的返回值。 
std::function对象最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等,但是可以与NULL或者nullptr进行比较。

function对象好处

std::function实现了一套类型消除机制,可以统一处理不同的函数对象类型。以前我们使用函数指针来完成这些;现在我们可以使用更安全的std::function来完成这些任务。

reference:

1.C++11中的std::function 
2.C++中的函数指针与函数对象的总结 
3.C++函数对象与函数指针不同之处 
4.指针函数与函数指针的区别

转载:http://blog.csdn.net/ty735195006/article/details/51362032

C++函数指针、函数对象与C++11 function对象对比分析相关推荐

  1. ❥关于C++之函数指针函数对象

    函数指针 以下是<cstdlib>库中的一个排序数组的方法qsort()的函数原型. void qsort (void* base, size_t num, size_t size,int ...

  2. C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组

    1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<windows.h> 4 /* 举列子说明什么是函数指针 * ...

  3. 函数指针amp;绑定: boost::functoin/std::function/bind

    see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow ...

  4. c语言map函数指针,函数指针 - 弧光守望者 - OSCHINA - 中文开源技术交流社区

    /*Author:Choas Lee *Date:2012-02-28 */ #include #include #include float add(float a,float b){return  ...

  5. C语言--返回指针的函数--指针函数

    人之所以痛苦,那是因为你在成长.--------magic_guo 函数可以返回整形.字符串.实型值.无返回值.也可以返回指针类型的数据,即返回一个内存地址,像这样返回地址的函数成为指针函数.其概念与 ...

  6. C语言 返回指针的函数--指针函数 int* max(int a)

    定义 strlong示例代码 代码1: #include<stdio.h> #include<string.h> //返回指针的函数//比较两个字符串,返回更长的字符串 cha ...

  7. 缔合legendre函数_常用超高阶次缔合勒让德函数计算方法对比分析.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp高等教育&nbsp>&nbsp理学 常用超高阶次缔合勒让德函数计算方法对比分析.pdf7页 ...

  8. C++中的函数指针和函数对象总结

    篇一.函数指针 函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址. 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参 ...

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

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

最新文章

  1. FPGA之道(2)FPGA应用方向
  2. java静态内部类了解一下
  3. 通过简易的前台代码实现无限二级域名转向(来自无忧 biyuan老矣)
  4. 收件箱java项目源码,Java物资管理系统项目源码(含数据库).zip
  5. 三、PHP基础——HTTP协议 文件编程
  6. 在iOS设备上如何使用Chrome浏览器的书签
  7. 使用电脑adb给Essential Phone刷机 —(官方篇)
  8. 微信小程序开发--【APP(Object)函数介绍】(三)
  9. 现在很火爆的外卖返利小程序源码免费分享一套源码
  10. 电阻和电容式触摸屏区别
  11. python whl文件_python whl是什么文件
  12. 漏洞修复:Insecure Transport: HSTS not Set
  13. Android吃鸡 3dtouch,吃鸡主播为何不用3Dtouch技术操作?主播:只有新手才会用
  14. Excel数据透视表经典教程十《值的汇总及显示方式》
  15. 自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之二)
  16. 音乐播放器微信小程序开发-歌单界面(简陋版)
  17. 高等数值计算方法学习笔记第4章第二部分【数值积分(数值微分)】
  18. 真正会赚钱的人,都有什么样的思维?
  19. Sting str = aaaa 的形式定义一个字符串最大长度只能有 65534 个。
  20. 图片.php,php图片_php 图片处理类

热门文章

  1. 使用QT设计飞机编队的功能
  2. 反序列化(Unserialize)漏洞详解
  3. vivoz3升级Android10,vivoZ3i 刷机教程 vivoZ3i 卡刷升级教程
  4. 二十九、接了一单Python数据分析的私活,心痛
  5. IPC基础概念介绍第一篇(Serializable接口)
  6. java中进程和线程的区别和联系_进程和线程有什么联系和区别?
  7. 张一鸣卸任字节跳动 CEO,网友调侃:字节某38岁高管因未完成去年OKR被优化!...
  8. STM32实现编码器电机【速度与位置环闭环控制】
  9. python画动态表情包_腾讯内容开放平台
  10. 某研究生不写论文竟研究起了算命?