天天看點

函數對象/仿函數

函數對象也被稱為智能型函數。

在類中重載了()函數調用運算符,那麼該類的對象就可以像使用普通函數一樣進行調用,該對象就被稱為函數對象。

函數對象與普通函數的優勢在于:

1、函數對象可以有自己的狀态,我們可以在類中定義狀态變量,這樣一個函數對象在多次的調用中可以共享這個狀态。

2、函數對象有自己特有的類型,可以傳遞相應的類型作為參數來執行個體化相應的模闆。

函數對象使用例子:

1、set容器中自定義類型的比較排序函數。

2、謂詞函數,實際就是判定函數,傳回bool值的函數。

普通的C++函數多用函數指針做參數傳遞,STL中多使用函數對象作為參數傳遞,提供函數指針類似的功能。

函數指針不能滿足STL對抽象性的要求。

将某種操作作為參數傳遞。可以利用函數指針,但是STL中使用的函數對象,原因有:

1、不能滿足STL對抽象性的要求。

2、不能滿足軟體積木的要求,函數指針無法和STL其他元件搭配,産生更靈活的變化。

一般來說我們讓一個函數儲存狀态的話,是在函數内定義static變量。這是靜态變量。使用函數對象就可以在成員變量中定義狀态變量。

基本概念:

生成器是不用參數就可以調用的函數符。

一進制函數是用一個參數就可以調用的函數符。

二進制函數是用兩個參數就可以調用的函數符。

傳回bool值的一進制函數是謂詞函數。(一進制判定函數)

傳回bool值的二進制函數是二進制謂詞。(二進制判定函數predicate)

在調用用到函數對象的标準庫算法時,觸發顯式指定為傳引用,否則預設情況下函數對象是值傳遞的。