天天看點

函數指針與仿函數

函數指針

在平常的C/C++代碼程式設計中, 我們經常會碰到函數指針(Function Pointer)這個概念,函數指針,顧名思義,指向函數入口的指針。

像我們平常使用的指向數組的指針,我們可以傳遞數組的位址。函數指針也一樣,我們用代碼示範一下具體用法:

#include<iostream>  
using namespace std;

typedef void(*func)(int);

void print(int value)
{
    printf("%d ", value);
}

void add(int &sum, int index, func pFunc)
{
    sum += index;
    pFunc(sum);
}

int main(void)
{
    int sum = 0;
    for (int i = 0; i < 10; i++)
    {
        add(sum, i, print);
    }
    system("pause");
    return 0;
}      

我們可以将一個函數名作為一個參數傳遞。

仿函數

在《C++标準程式庫》一書中對仿函數的解釋是:任何東西,隻要其行為像函數,就可以稱之為仿函數。

那麼仿函數到底是什麼呢?

想一下,我們平常調用函數少不了的是什麼?

函數行為,是指可以使用小括号傳送參數,調用某個東西

是以隻要我們定義的對象可以有這種行為就可以了,是以我們要成為仿函數,就必須要重載()操作符,以讓對象的行為像函數。一個對象,具備像函數一樣的行為, 就稱為函數對象。

#include<iostream>  
using namespace std;

class MyPrint
{
public:
    void operator()(int value) const
    {
        printf("%d ", value);
    }
};

void add(int &sum, int index, MyPrint &pFunc)
{
    sum += index;
    pFunc(sum);
}

int main(void)
{
    int sum = 0;
    MyPrint print;
    for (int i = 0; i < 10; i++)
    {
        add(sum, i, print);
    }

    system("pause");
    return 0;
}      

函數指針與仿函數的差別

繼續閱讀