以前去面試的時候被問道過函數的指針和回調函數。都沒有回答上來== html
1.回顧下C++primer 的7.9節 指向函數的指針(順便回顧下第七章)面試
2.回調函數算法
3.動態建立對象數組
參考資料:C++Primer第四版7.9節函數
1.函數指針是指向函數類型的指針。而函數類型只由返回類型以及形參表肯定,跟函數名字無關。spa
用typedef簡化函數指針的定義:指針
//使用typedef簡化 定義函數指針p1和p2 一勞永逸~~~~視頻
typedef bool (*funp) (const string& , int); htm
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
下面是一篇用函數指針和模版 來實現 簡單的委託的機制