函數對象 =》C語言中的函數指針 函數對象 儘管函數指針被廣泛用於實現函數回調,但C++還提供了一個重要的實現回調函數的方法,那就是函數對象。函數對象(也稱“函數符”)是重載了“()”操作符的普通類對象。因此從語法上講,函數對象與普通的函數行為類似。 用函數對象代替函數指針有幾個優點: 首先,因為對 ...
函數對象 =》C語言中的函數指針
函數對象
儘管函數指針被廣泛用於實現函數回調,但C++還提供了一個重要的實現回調函數的方法,那就是函數對象。函數對象(也稱“函數符”)是重載了“()”操作符的普通類對象。因此從語法上講,函數對象與普通的函數行為類似。
用函數對象代替函數指針有幾個優點:
首先,因為對象可以在內部修改而不用改動外部介面,因此設計更靈活,更富有彈性。函數對象也具備有存儲先前調用結果的數據成員。在使用普通函數時需要將先前調用的結果存儲在全程或者本地靜態變數中,但是全程或者本地靜態變數有某些我們不願意看到的缺陷。
其次,在函數對象中編譯器能實現內聯調用,從而更進一步增強了性能。這在函數指針中幾乎是不可能實現的。
C++11還提供了limbda表達式來實現函數的靈活調用
為什麼要用函數對象呢?
上圖中 return comp(a,b);通過函數指針調用函數是沒有辦法內聯的,效率低,因為有函數調用開銷,C++通過函數對象解決
template<typename T>
class mygreater
{
public:
bool operator()(T a,T b){
return a>b;
}
};
template<typename T>
class myless
{
public:
bool operator()(T a,T b){
return a<b;
}
};
template<typename T ,typename Compare>
bool compare(T a,T b,Compare comp)
{
return comp(a,b);
}
compare(10,20,mygreater<int>());
compare(10,20,myless<int>());
1:通過函數對象調用operator()可以省略函數的調用開銷比通過函數指針調用函數(不能夠inline內聯調用) 效率高
2:因為函數對象是用類生成的,所以可以添加想關的成員變數,用來記錄函數對象的使用信息