C++函數(shù)對象

轉(zhuǎn)自:C++函數(shù)對象operator()-CSDN博客

函數(shù)對象:定義了調(diào)用操作符()的類對象。當(dāng)用該對象調(diào)用此操作符時,其表現(xiàn)形式如同普>通>函數(shù)調(diào)用一般,因此取名叫函數(shù)對象。

operator()

  • 函數(shù)對象的實現(xiàn)主要通過在類中或者結(jié)構(gòu)體中重載()操作符operator()
class IsNeg {  
public:  
    bool operator()(int val)  {  
        return val > 0 ? false: true;
    }  
};  
  • 與普通函數(shù)相比,函數(shù)對象比函數(shù)更加靈活,類isNeg 中定義了操作符 ( ),isNeg 對象調(diào)用語句在形式上跟以下函數(shù)的調(diào)用完全一樣:
int a = -1;
IsNeg isNeg 
cout << isNeg(a);

函數(shù)對象的優(yōu)勢

  • 函數(shù)對象可以有自己的狀態(tài)(私有變量),我們可以在類中定義狀態(tài)變量
  • 函數(shù)對象有自己特有的類型。我們可以傳遞相應(yīng)的類型作為參數(shù)來實例化相應(yīng)的模板,比如說帶參數(shù)的函數(shù)形參

使用函數(shù)對象的典型例子

定義排序規(guī)則

  • 在容器set中對string 進行排序,首先來定義相應(yīng)的類并定義 operator() 來規(guī)定排序規(guī)則:
class cmp{  
public:  
    bool operator() (const string &str1, const string &str2) const {  //帶兩個參數(shù)
        return str1 > str2;  
    }  
};  
set<string, cmp> myset;  //帶比較函數(shù)的set構(gòu)造函數(shù),并用函數(shù)對象cmp初始化
myset.insert("A");  
myset.insert("B");        // 這樣容器內(nèi)容輸出為BA
  • 大根堆(有限隊列)
struct node;
struct cmp {
    bool operator()(node a,node b) {
        if(a.x == b.x)  return a.y >= b.y;
        else return a.x > b.x;
    }
};
priority_queue<node, vector<node>, cmp> que;   // 大根堆 堆頂是最大值

謂詞函數(shù)

  • 謂詞函數(shù)通常用來對傳進來的參數(shù)進行判斷,并返回布爾值。但是一般的函數(shù)形式固化,比如字符串長度比較只能判斷是否大于一個確定的長度值。
  • 函數(shù)對象可以作為謂詞函數(shù),并可以在類初始化時傳遞參數(shù),如字符串長度參考值,因此函數(shù)對象比普通函數(shù)更加靈活。

現(xiàn)在假設(shè)我們有一串?dāng)?shù)字,要從中找出第一個不小于10的數(shù)字。可以定義如下相應(yīng)的類:

class Upper {  
public:  
    Upper(int min = 0):min(min){}  
    bool operator() (int value) const {  
        return value >= min;  
    }  
private:  
    int min;  
};  

從而這樣調(diào)用 find_if 函數(shù):

find_if(dest.begin(), dest.end(), Upper(10));

首先生成類 Upper 的對象,并用 10 初始化,調(diào)用find_if 時將用該函數(shù)對象進行判斷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容