天天看點

8、泛型程式設計與c++标準模闆庫5.函數對象

1、函數對象

函數對象是STL提供的第四類主要元件,它使得STL的應用更加靈活友善,進而增強了算法的通用性。大多數STL算法可以用一個函數對象作為參數。所謂“函數對象”其實就是一個行為類似函數的對象,它可以不需要參數,也可以帶有若幹參數,其功能是擷取一個值,或者改變操作的狀态。

在c++程式設計中,任何普通的函數和任何重載了調用運算符operator()的類的對象都滿足函數對象的特征,是以都可以作為函數對象傳遞給算法作為參數使用。

以數值算法accumulate()為例子,介紹函數對象的設計及應用過程。

數值算法accumulate()的調用格式包括兩種:第一種調用格式是以"+"運算符作為運算規則,第二種算法允許使用者銅鼓哦傳遞給算法相應的函數對象來指定計算規則。

一般來說,使用者設計的普通函數就是一種最簡單的函數對象,

例子1:利用普通函數來定義函數對象

#include<iostream>

#include<numeric>  //包含數值算法頭檔案

using namespace std;

int mutl(int x, int y)

{ return x + y; }//定義一個普通函數

int main() {

 int A[] = {1,2,3,4,5};  

const int N = sizeof(A) / sizeof(int);  

cout << "The result by multipling all elements in A is"   << accumulate(A, A + N, 1, mutl);

 getchar();  

cout<<endl;//将普通函數mutl傳遞給通用算法

}

除了普通函數,另一類函數對象可以是類的對象,并且在定義中重載函數調用運算符。

例子2:改寫上面的程式

class multclass   //定義multclass類

{ public:

 int operator()( int x, int y )const{return x*y; }//重載操作符operator()

};

int main()

{  

int A[] = { 1, 2, 3, 4, 5 };  

cout << "The result by multipling all elements in A is"   << accumulate(A, A + N, 1, multclass());//将類multclass傳遞給通用算法

cout << endl;//将普通函數mutl傳遞給通用算法

分析:通過在類multclass中重載運算符operator(),就定義了一種可以作為函數參數的對象,同樣可以像使用普通函數mutl一樣來使用該對象。但是這裡傳遞給算法accumulate的對象是通過multclass類的預設構造函數multclass()獲得的,它可以由編譯器自動提供。使用類的形式定義的函數對象能夠比普通函數攜帶更多的額外資訊。

除了上面之外,STL中也定義了一些标準的函數對象,如果以功能劃分,可以分為算數運算、關系運算、邏輯運算三大類。為了調用這些标準函數對象,需要包含頭檔案<functional>。标準函數對象是内連函數。