C 函式物件

2021-06-08 15:57:09 字數 1802 閱讀 3446

函式物件實質上是乙個實現了operator()--括號操作符過載--的類。它與函式指標用法一樣,但是它有乙個優點,函式指標不可以傳遞附加資料過去,但是在函式物件中,我們可以傳遞附加資料過去。

先講解下運算子過載吧,對於運算子函式我們有兩種定義方式,

1,如果此函式是屬於乙個類的成員函式,那麼我們是這麼定義的:參考<< ,如下:

ostream & operator<<(const string & str);

我們可以通過這樣的形式來呼叫:cout << str ;

注意:按正常情況下,對於乙個類a中的函式,我們應該這樣呼叫此類中的成員函式:a.func() ,但是對於運算子過載函式,我們並不是這樣,如同cout << str ,cout就是呼叫《運算子的乙個物件,這裡沒有點號了。

2,如果此函式並非另乙個類中的成員函式,而是乙個普通函式,那麼我們應該這麼定義:

type operator(a, b); type是返回型別

我們可以這樣使用:a operator b;

所以對於過載了()運算子的函式物件類,如果通過函式物件類定義了乙個物件a,那麼我們這樣使用物件a的「()」運算子過載:

a();

對,就這樣,表明此「()」是物件a中的成員函式

如果要傳遞引數的話,可以這樣:a(type name, ......); name就是傳遞到「()」過載函式中的引數

下面看兩個例子:

第乙個是演示函式物件怎麼使用的:

view source

print?01

#include 02

#include 03

04using namespace std; 05

06class funobject 12

void operator()(char *name) 17

private: 18

string str; 19

}; 2021

int main() 22

執行結果:

view source

print?1

[chengyang@localhost functionobject]$ ./test2 2

hello 3

hello kitty

函式物件經常用於c++標準演算法中,作為乙個操作函式引數傳遞

另外,函式物件還有乙個函式指標無法匹敵的用法:可以用來封裝類成員函式指標!

因為函式物件可以攜帶附加資料,而成員函式指標缺少乙個類實體(類例項)指標來呼叫,因此,可以把類實體指標給函式物件儲存起來,就可以用於呼叫對應類實體成員函式了。

看如下**:

view source

print?01

#include 02

03using namespace std; 04

05class a 09

}; 1011

12template 13

class funobject //建構函式,傳遞附加資料 16

void operator()(const char *name)//通過此函式封裝某乙個類的函式 17

20private: 21

void(t::*pfunc)(const char *);//儲存某乙個類中的函式 22

t *pobj;//儲存某乙個類的乙個物件 23

}; 2425

int main() 26

運算結果如下:

view source

print?1

[chengyang@localhost functionobject]$ ./test1 2

hello kitty!

c 函式物件

標準庫里的count if可以統計容器中滿足特定條件的元素的個數。例如要統計乙個整數vector ivec中正數的個數,可以先寫乙個返回型別為bool,含有乙個int引數的條件函式 class pred 這樣,剛才的統計語句就應該寫成 count if ivec.begin ivec.end pre...

C 函式物件

標準庫里的count if可以統計容器中滿足特定條件的元素的個數。例如要統計乙個整數vector ivec中正數的個數,可以先寫乙個返回型別為bool,含有乙個int引數的條件函式 bool pred int val 之後可以用count if ivec.begin ivec.end pred 計算...

C 函式物件

標準庫里的count if可以統計容器中滿足特定條件的元素的個數。例如要統計乙個整數vector ivec中正數的個數,可以先寫乙個返回型別為bool,含有乙個int引數的條件函式 pred intval 之後可以用count if ivec.begin ivec.end pred 計算出正整數的個...