1、概念:
函式指標指向某種特定型別,宣告乙個執行函式的指標,只需將指標替換函式名即可
int add(int nleft,int nright);//普通函式
宣告:int (*pf) (int,int);//函式指標,pf是指向函式的指標
pf前面有*表示pf是指標,右側是形參列表表示pf指向的是函式,函式返回型別是int。
2、使用函式指標
指標pf 可以指向具體的add 函式。pf=add;(前提是pf和add的返回型別相同)
呼叫:pf(100,50)-----add(100,50)------(*pf)(100,50)都符合規定
#include using namespace std;
int add(int x, int y)
int main()
3、函式指標作為形參
//第二個形參為函式型別,會自動轉換為指向此類函式的指標
void fuc(int nvalue,int pf(int,int));
//等價的宣告,顯示的將形參定義為指向函式的指標
void fuc(int nvalue,int (*pf)(int,int));
呼叫:func(1,add)-----func(1,pf)
4、返回指向函式的指標
int (*fuc2(int))(int,int);//顯示定義
引入函式物件
#include #include #include using namespace std;
//全域性變數sum
int sum = 0;
//定義全域性函式f(int)
void f(int x)
int main()
//函式作為形參
for_each(v.begin(), v.end(), f);
cout << sum;
return 0;
}
為了實現這個求和功能,使用了乙個 sum 全域性變數,並且 f(int) 是乙個全域性函式。
隨著 c++ 物件導向的思想的普及和發展,絕大多數的功能都封裝在了類中,實現模組化程式設計。那麼上述函式將被封裝成如下形式:
//類sum
class sum
//成員函式
void f(int x)
//成員函式
int getsum()
};
函式物件是過載了 operator() 的類的乙個例項,operator() 是函式呼叫運算子。
class sum
void operator()(int x)
int getsum()
};
注意!與之前的區別在於過載了 operator() 而不是 f() 函式。
則該類的物件成了函式物件
#include #include #include using namespace std;
//類sum
class sum
//函式物件!!!!!
void operator()(int x)
//成員函式
int getsum()
};int main()
sum s;
//sum類的物件成為了函式物件
//能夠和函式名字相匹配的是函式指標int(*op)(int, int)
s=for_each(v.begin(), v.end(), sum());
//成員函式getsum()
cout << s.getsum();
return 0;
}
優點:
(1)函式物件有自己的狀態,即它可以攜帶自己的成員函式,而且這個函式物件在多次呼叫的過程中它的那些狀態是共享的,而函式則不能做到這點(除非定義函式內部的靜態變數或者全域性變數)。
(2)函式物件有自己的型別,而普通函式則沒有。在使用stl的容器時可以將函式物件的型別傳遞給容器作為引數來例項化相應的模板,從而來定製自己的演算法,如排序演算法。
(3)可以用(而且提倡、建議)函式物件來代替函式指標。函式物件可以在內部修改而不用改動外部介面
函式物件與函式指標
過載了 運算子的自定義型別生成的物件可以像函式名一樣呼叫該類的 運算子函式,所以該物件稱為函式物件。函式物件一般被用於代替函式指標。函式指標作為另外乙個函式的引數,可以使該函式更具通用性,使程式更具可擴充套件性,通過程式1 使用函式指標 和程式2 使用函式物件 的比較,來說明函式物件相對於函式指標的...
函式指標與指標函式
指標函式 指標函式是指函式的返回值型別是乙個指標型別,即本質是乙個函式。我們知道函式都有返回型別 如果不返回值,則為無值型 只不過指標函式返回型別是某一型別的指標。其定義格式如下所示 返回型別識別符號 返回名稱 形式參數列 返回型別可以是任何基本型別和復合型別。返回指標的函式的用途十分廣泛。事實上,...
函式指標與指標函式
函式指標 在程式執行中,函式 是程式的演算法指令部分,它們和陣列一樣也占用儲存空間,都有相應的位址。可以使用指標變數指向陣列的首位址,也可以使用指標變數指向函式 的首位址,指向函式 首位址的指標變數稱為函式指標。1 函式指標定義 函式型別 指標變數名 形參列表 函式型別 說明函式的返回型別,由於 的...