過載了「( )」運算子的自定義型別生成的物件可以像函式名一樣呼叫該類的「( )」運算子函式,所以該物件稱為函式物件。函式物件一般被用於代替函式指標。函式指標作為另外乙個函式的引數,可以使該函式更具通用性,使程式更具可擴充套件性,通過程式1(使用函式指標)和程式2(使用函式物件)的比較,來說明函式物件相對於函式指標的優勢.
1、//使用函式指標的情況:
2 #include
3 using std::cout;
4 using std::endl;
5 6 void print_if(const int * arr,int len,bool (*con)(int))
7 13 bool less_5(int n)
14
17 bool greater_10(int n)
18
21 bool not_equal_0(int n)
22
25 int main()
26 ;
28
29 print_if(a,10,less_5);
30 print_if(a,10,greater_10);
31 print_if(a,10,not_equal_0);
32
33 return 0;
34 }
顯式結果:
0 1 2 4 0 0
35 46
1 2 35 46 4 8 6
程式1中的函式print_if使用函式指標作為引數,使其有一定的通用性。但是,這種通用性是有限的,例如,如果想要輸出陣列中小於20、大於30等等滿足其它條件的元素時,程式總要為新的條件新增類似於less_20、greater_30的判定函式。這一缺陷使print_if函式不能使用執行時的判定條件進行陣列元素的輸出(判定函式總是事先寫好)。為了解決這一問題,需要一種執行時把資訊傳遞給判定函式的方法.因此我們可以使用函式物件代替函式指標。函式物件可以向全域性函式一樣執行某種操作,又可以像物件一樣通過成員變數內建一些資訊。
1//使用函式物件的情況
2 #include
3 using std::cout;
4 using std::endl;
5 enum relations ;//定義的有限集合常量,參看下一文" enum型別的本質".
6 class functionobject
7 13 bool operator()(int n)
14
25 }
26 };
27 void print_if(const int *arr,int len,functionobject con)
28
34
35 int main()
36 ;
38
39 print_if(a,10,functionobject(5,less));
40 print_if(a,10,functionobject(10,greater));
41 print_if(a,10,functionobject(0,not_equal));
42
43 return 0;
44 }
顯式結果:
0 1 2 4 0 0
35 46
1 2 35 46 4 8 6
函式print_if的第3個引數是functionobject生成的函式物件,在這3次函式print_if的呼叫中,我們通過傳遞不同的無名函式物件,來輸出滿足不同條件的陣列元素。
函式指標與函式物件
1 概念 函式指標指向某種特定型別,宣告乙個執行函式的指標,只需將指標替換函式名即可 int add int nleft,int nright 普通函式 宣告 int pf int,int 函式指標,pf是指向函式的指標 pf前面有 表示pf是指標,右側是形參列表表示pf指向的是函式,函式返回型別是...
函式指標與指標函式
指標函式 指標函式是指函式的返回值型別是乙個指標型別,即本質是乙個函式。我們知道函式都有返回型別 如果不返回值,則為無值型 只不過指標函式返回型別是某一型別的指標。其定義格式如下所示 返回型別識別符號 返回名稱 形式參數列 返回型別可以是任何基本型別和復合型別。返回指標的函式的用途十分廣泛。事實上,...
函式指標與指標函式
函式指標 在程式執行中,函式 是程式的演算法指令部分,它們和陣列一樣也占用儲存空間,都有相應的位址。可以使用指標變數指向陣列的首位址,也可以使用指標變數指向函式 的首位址,指向函式 首位址的指標變數稱為函式指標。1 函式指標定義 函式型別 指標變數名 形參列表 函式型別 說明函式的返回型別,由於 的...