1. 定義:
函數對象:所有重載了函數調用操作符(operator())的類對象,又稱為函數子。在STL中,大多數使用函數子的地方都可以使用函數指針
(ps:set和multiset的比較類型必須是函數對象,而不能是函數指針)通過將operator設置為內聯函數,可以使程序性能加速。
函數指針:指向某種(函數參數,返回值)的函數類型的指針,每個函數都有一個入口地址,函數指針便是指向了函數的入口地址。通過將函數指針傳入函數中,方便一個函數調用另一類型的函數。如: int GetMaxValue( double x, bool (*ptr)(int, int) ),其中ptr即為函數指針。
c++中這樣使用函數指針:
bool greaterNum(int x, int y) { return x>y; } using PF = bool (*)(int, int); //或typedef int (*PF)(int, int); PF pf = greaterNum; cout<<pf(4,10)<<endl; //輸出為0
2. 例子:
使用函數指針和函數對象作為STL中sort的參數,實#include <iostream>
#include <vector> #include <algorithm> #include <functional> using namespace std; template<typename T> class GreaterNum : public binary_function<T, T, bool> { public: inline bool operator()(T x, T y) { return x>y; } }; bool greaterNum(int x, int y) { return x>y; } void print(int x) { cout<<x<<" "; } int main() { vector<int> v1 = {21,6,21,4,2,1,45,6,1,7,9,5,2}; auto v2 = v1; /*使用函數對象為第三個參數*/ sort( v1.begin(), v1.end(), GreaterNum<int>() ); for_each(v1.begin(), v1.end(), print); cout<<endl; /*使用函數指針為第三個參數*/ sort( v2.begin(), v2.end(), greaterNum ); for_each(v2.begin(), v2.end(), print); return 0; }
3. 函數對象的優勢:
(1)函數對象通過重載()實現,那么將operator()函數設置為內聯函數,可以
提高程序的運行速度。如上面的例子,相比於傳入greaterNum函數指針為sort的第三個形參,傳入是GreaterNum<int>函數子時,程序運行的速度快。因為內聯函數在編譯時展開,而函數指針要進行調用。
(2)函數對象可以
攜帶附加信息,如類的其他數據成員,而函數指針則做不到。
