1. 程式人生 > >函式指標、函式物件、仿函式比較與入門

函式指標、函式物件、仿函式比較與入門

#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);  
    }  
  
    return 0;  
}  

列印結果為:
0 1 3 6 10 15 21 28 36 45 請按任意鍵繼續. . .
從上面可以看出,我們可以將一個函式名作為一個引數傳遞,這就是函式指標的大概用法,具體詳細用法,請大家自行谷歌, 重點是下面的兩個東西。

仿函式、函式物件(Functors、Function Objects)

首先,我們看看在《C++標準程式庫》一書中對仿函式的解釋:任何東西,只要其行為像函式,就可以稱之為仿函式。我們再看我們的下面這句程式碼:
for (int i = 0; i < 10; i++)  
{  
   add(sum ,i, print);
}  
我們看到這個print,有木有想過, 它可以是一個類的物件呢,比如,MyPrint print這種形式,只要他具備某種函式行為就可以了,所謂函式行為,,是指可以使用”小括號傳送引數, 呼叫某個東西”,比如function1(arg1,arg2);(摘自《C++標準程式庫》),
所以只要我們定義的物件可以有這種行為就可以了,因此我們必須要過載()操作符,以讓物件的行為像函式。因為一個物件,具備像函式一樣的行為, 就稱為函式物件。 下面我們就把上面用函式指標改成用函式物件的形式
#include "stdafx.h"  
  
#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);  
    }  
  
    return 0;  
}  

如果講到這裡, 我們就結束了的話, 肯定會不禁要問, 這兩者有什麼區別,既然有了函式指標, 還要函式物件幹嘛。 首先,一個類,是資料以及對資料操作的行為的集合, 而我們現在的函式物件,只擁有方法, 而沒有使用它的資料,但是在函式指標,是無法儲存資料的, 所以,函式物件比函式指標功能更強, 因為它可以儲存資料,利用這一特性, 是函式指標無法比擬的優勢。