关于函数指针

之前去面试的时候被问道过函数的指针回调函数。都没有回答上来==

1.回顾下C++primer 的7.9节 指向函数的指针(顺便回顾下第七章)

2.回调函数

3.动态创建对象

 

参考资料:C++Primer第四版7.9节

1.函数指针是指向函数类型的指针。而函数类型只由返回类型以及形参表确定,跟函数名字无关。

用typedef简化函数指针的定义:

//使用typedef简化   定义函数指针p1和p2  一劳永逸~~~~

typedef bool (*funp) (const string& , int);  

funp p1;  

funp p2;

//不使用typedef    定义函数指针p3和p4  

bool (*p3) (const string&, int);  

bool (*p4) (const string&, int);

函数指针的初始化和赋值:只能通过同类型的函数或者是函数指针(不同函数类型的指针不存在转化)或者0值常量(表示不指向任何函数)进行初始化或者赋值

除了用作函数调用的左操作数外,对funp的任何使用都被解释为指针类型:bool  funp (const string&, int)------>bool(*) (const string&, int);  

 bool fun(const string&, int);
 p1 = 0;
 p2 = fun; //函数名自动解释为函数指针类型。就像数组名直接解释为数组指针?
 p3 = &fun;//直接引用函数名等效于在函数名上应用取地址操作符;
 p4 = p3;

通过指针调用函数:函数指针可以调用它所指向的函数(前提就是该指针已经初始化或者是赋值给了一个函数)

fun("sleep", 8);

p2("sleep",8);//隐式解引用

(*p2)("sleep",8);//显示解引用

函数指针形参:形参的两种表示方法

bool function(const string&, int,bool(*) (const string&, int))或者是bool function(const string&, int,bool (const string&, int))

返回指向函数的指针:

int (*ff(int))(int *, int);//ff是一个函数名,形参是int,返回类型是函数指针。此函数指针是一个指向“返回类型为int,参数表为(int*,int)”的函数

等价于

typedef int (*PF)(int *, int);

PF ff(int);//允许将形参定义为函数类型,但是返回类型不允许是函数类型,只能是指向函数的指针。类似的不能返回数组,只能返回数组元素的指针

指向重载函数的指针:指针的类型必须与重载函数的一个版本精确匹配。如果没有,则对该指针的初始化和赋值都将导致编译失败。

 2.回调其实就是一种利用函数指针进行函数调用的过程。回调函数就是函数指针的一种用法?!

程序退出时的回调函数:当程序通过调用exit()或从main 中返回时, 回调函数中参数function 所指定的函数会先被调用, 然后才真正由exit()结束程序。_onexit与atexit,其定义如下:先进后出的原则&并关注被调用函数的类型。

atexit:https://msdn.microsoft.com/zh-cn/vstudio/tze57ck3 返回类型void 参数void

_onexit:https://msdn.microsoft.com/zh-cn/vstudio/zk17ww08.aspx返回类型int 参数void

STL中众多算法和程序都用到回调:如不想在排序函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时就可以使用函数指针,并进行回调。

回调函数用于实现通知机制。

3.《跟我一起学C++》视频教程第36课。回顾动态创建对象中就是用到了函数指针。实现了反射的机制,实现工厂模式。

 

 

下面两篇是讲解 指向类成员的函数指针的,以及基本的函数指针

http://www.cnblogs.com/AnnieKim/archive/2011/12/04/2275589.html

http://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html

 

 

下面是一篇用函数指针和模版 来实现 简单的委托的机制

http://xhrwang.me/2014/07/23/delegate-and-event-in-cpp.html

posted @ 2015-05-10 11:27  ivy_0709  阅读(154)  评论(0编辑  收藏  举报