C 函式物件

2021-10-24 17:23:41 字數 2645 閱讀 3629

函式物件也稱為仿函式,需要過載運算子operator(),函式物件可以接受0到多個引數,只需在operator()後面新增即可如:

bool  operator()

//或者

bool  operator()(int n)

函式物件使用時必須帶(),引數寫在()後面。範例

class cfunobj

};int main()

接下來區分函式和函式物件

//普通函式

void printfun(int n)

//函式物件

class printobj

};int main(void)

; vector< int> v(a, a + 5);

for_each(v.begin(), v.end(), printfun);

cout根據for_each的定義

templateinline

_fn1 for_each(_init _first, _init _last, _fn1 _func)

第三個引數_func需要傳入乙個函式,由上例可知printfun == printobj() 。而printobj()在for_each中拆開就類似於

printobj()(1/*v.begin()*/)
再來看乙個例子:

struct mygreater

};int main( void)

其中mygreater是我們自定義的函式物件。

根據map的宣告:

template,//函式物件

class _alloc = allocator> >

class map

: public _tree<_tmap_traits _ty _pr _alloc false> >

public:

typedef map<_kty _ty _pr _alloc> _myt;

typedef _tree<_tmap_traits _ty _pr _alloc false> > _mybase;

typedef _kty key_type;

......略

其中第三個引數——pr是傳入乙個函式物件,由於map 在這僅僅是宣告,因此這裡必須傳入mygreater而不帶()。

那麼什麼時候傳入的函式物件需要(),什麼時候不需要呢?簡單來說宣告的時候需要,實現的時候不需要。更簡單的說被<>包住的時候不需要,被()包住的時候需要。被()包住的,傳入函式名或者函式物件名帶()都可以,但是被<>包住的只能傳入函式物件名。如下:

struct mygreater

};bool is_odd2()

int main(void)

; vector< int> v(a, a + 5);

for_each(v.begin(), v.end(), addobj2()/*is_odd2可以,addobj2不行*/);

cout << count_if(v.begin(), v.end(), mygreater()/*is_odd2可以,addobj2不行*/) << endl;

}

再看另乙個例子:

//普通函式

void printfun(int n)

//函式物件

class addobj

void operator()(int &n)

private:

int number_;

};class greaterobj

bool operator()(int n)

private:

int number_;

};int main(void)

; vector< int> v(a, a + 5);

for_each(v.begin(), v.end(), addobj(5));

for_each(v.begin(), v.end(), printfun);

cout << count_if(a, a + 5, greaterobj(3)) << endl; //計算大於3的元素個數

}

for_each的第三個引數需要乙個函式,將addobj改造成函式需要加(),但是addobj的預設構造需要引數,因此最終形態是addobj(5)。greaterobj也是一樣的原理.

由此可見,作為for_each的第三個引數,由於不支援傳參,函式只能實現單一的功能,如果想add3,add5,add7,那麼需要多個函式。而使用函式物件代替,只需要addobj(3),addobj(5),addobj(7)。泛型編**的是大大提高了復用性。

如果我們說模板將c++中的型別泛型化了,那麼可以理解函式物件將c++中演算法泛型化了。

stl內建函式物件:

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 函式物件

函式物件實質上是乙個實現了operator 括號操作符過載 的類。它與函式指標用法一樣,但是它有乙個優點,函式指標不可以傳遞附加資料過去,但是在函式物件中,我們可以傳遞附加資料過去。先講解下運算子過載吧,對於運算子函式我們有兩種定義方式,1,如果此函式是屬於乙個類的成員函式,那麼我們是這麼定義的 參...