C++ STL 之 函數對象


重載函數調用操作符的類,其對象常稱為函數對象(function object),即它們是行為類似函數的對象,也叫仿函數(functor),其實就是重載“()”操作符,使得類對象可以像函數那樣調用。
注意:1.函數對象(仿函數)是一個類,不是一個函數。2.函數對象(仿函數)重載了”() ”操作符使得它可以像函數一樣調用。
假定某個類有一個重載的 operator(),而且重載的 operator()要求獲取一個參數,我們就將這個類稱為“一元仿函數”(unary functor);相反,如果重載的 operator()要求獲取兩個參數,就將這個類稱為“二元仿函數”(binary functor)。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class FuncObject01
{
public:
    void operator()()
    {
        cout << "Hello WOrld!" << endl;
    }
};

void FuncObject02()
{
    cout << "Hello WOrld!" << endl;
}

void test01()
{
    FuncObject01 fobj;
    fobj();
    FuncObject02();
    cout << "------------" << endl;
}

class FuncObject03
{
public:
    int operator()(int a, int b)
    {
        return a + b;
    }
};

int FuncObject04(int a, int b)
{
    return a + b;
}

// 函數對象也可以像普通函數一樣 具有返回值和參數
void test02()
{
    FuncObject03 fobj;
    int ret = fobj(10, 20);
    cout << "ret = " << ret << endl;
    ret = FuncObject04(10, 30);
    cout << "ret = " << ret << endl;
    cout << "------------------------" << endl;
}

// 函數對象超出了普通函數的功能,可以具有保存函數調用狀態
// 例如 我們要統計函數的調用次數

class FuncObject05
{
public:
    FuncObject05() : count(0) {}
    void operator()()
    {
        cout << "Hello World!" << endl;
        count++;
    }
    int count;
};

// 普通函數統計調用次數,需要一個全局變量
int g_count = 0;
void FuncObject06()
{
    cout << "Hello World!" << endl;
    g_count++;
}

void test03()
{
    FuncObject06();
    FuncObject06();
    cout << "函數調用次數:" << g_count << endl;
    // 使用函數對象不需要使用全局變量
    FuncObject05 fobj;
    fobj();
    fobj();
    fobj();
    cout << "函數調用次數:" << fobj.count << endl;
    cout << "---------------------------" << endl;
}

// 函數對象做參數和返回值
class print
{
public:
    print() : count(0){}
    void operator()(const int& val)
    {
        cout << val << " ";
        count++;
    }
    int count;
};

int num = 0;
void print2(int val)
{
    cout << val << " ";
    num++;
}

void test04()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(3);
    v.push_back(5);
    v.push_back(2);
    // 通過for_each算法 遍歷容器元素
    print myprint;
    // 函數對象做返回值和參數
    myprint = for_each(v.begin(), v.end(), myprint);
    cout << endl;
    cout << "函數調用次數:" << myprint.count << endl;
    for_each(v.begin(), v.end(), print2);
    cout << endl;
    cout << "函數調用次數:" << num << endl;
}

int main()
{
    test01();
    test02();
    test03();
    test04();
    getchar();
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM