過載函式呼叫操作符「()」的類,其物件常稱為函式物件(function object),即它們是行為類似函式的物件,也叫仿函式(functor),其實就是過載「()」操作符,使得類物件可以像函式那樣呼叫。
注:1、函式物件(仿函式)是乙個類,不是乙個函式
2、函式物件(仿函式)過載了」()」操作符使得它可以像函式一樣呼叫。
函式物件可以像普通函式一樣呼叫。
函式物件可以像普通函式那樣接收引數。
函式物件超出了函式的概念,函式物件可以儲存函式呼叫的狀態(通過類內部成員實現)。
這是乙個仿函式,令其實現列印和儲存呼叫次數的功能:
struct myprint
void
operator()
(int val)
public
:int num;
};
我們在乙個vector中結合for_each使用它:
vector<
int> myvector;
myvector.
push_back(10
);myvector.
push_back(20
);myvector.
push_back(30
);myvector.
push_back(40
);myprint print;
//檢視for_each的定義可知,它返回乙個與print同型別的物件,且引數中print
//是拷貝過去的,而不是引用。
myprint print2=
for_each
(myvector.
begin()
,myvector.
end(
),print)
;cout<
//輸出0
cout<
//輸出4
謂詞是指普通函式或過載的operator()返回值是bool型別的函式物件(仿函式)。如果operator接受乙個引數,那麼叫做一元謂詞,如果接受兩個引數,那麼叫做二元謂詞,謂詞可作為乙個判斷式。
stl內建了一些函式物件。
分為:算數類函式物件,關係運算類函式物件,邏輯運算類仿函式。
這些仿函式所產生的物件,用法和一般函式完全相同,當然我們還可以產生無名的臨時物件來履行函式功能。
使用內建函式物件,需要引入標頭檔案#include
。
算數類函式物件
6個算數類函式物件,除了negate是一元運算,其他都是二元運算。
關係運算類函式物件
6個都是二元運算。
邏輯運算類仿函式
邏輯運算類運算函式,not為一元運算,其餘為二元運算。
繫結介面卡
將乙個二元函式物件轉變成一元函式物件。
取反介面卡
還有一些介面卡
C 學習筆記 (函式物件(仿函式))
先考慮乙個簡單的例子 假設有乙個vector,你的任務是統計長度小於5的string的個數,如果使用count if函式的話,你的 可能長成這樣 bool lengthislessthanfive const string str int res count if vec.begin vec.end...
C 函式物件 仿函式
概念 模仿函式的類,使用方式如同函式 本質 函式物件是乙個類,類中對小括號 進行了函式過載。仿函式主要用於stl中的演算法中,函式指標雖然也可以作為演算法的引數,但它不能滿足stl對抽象性的要求,也不能滿足軟體積木的要求 函式指標無法和stl其他元件搭配,產生更靈活變化。案例 如下 include ...
stl 仿函式 函式物件
定義 stl原始碼剖析 仿函式其實上就是乙個 行為類似函式 的物件。即主體是物件,只是使用起來像乙個函式。傳遞函式指標 templatebool compare to const t x,const t y templatevoid print compare t fun int main 傳遞的是...