函式指標、函式物件、仿函式比較與入門
阿新 • • 發佈:2019-01-05
#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; }
如果講到這裡, 我們就結束了的話, 肯定會不禁要問, 這兩者有什麼區別,既然有了函式指標, 還要函式物件幹嘛。 首先,一個類,是資料以及對資料操作的行為的集合, 而我們現在的函式物件,只擁有方法, 而沒有使用它的資料,但是在函式指標,是無法儲存資料的, 所以,函式物件比函式指標功能更強, 因為它可以儲存資料,利用這一特性, 是函式指標無法比擬的優勢。