2014-02-09 34 views
0

我們做了一個家庭作業,現在已經完成了,教授給了我們解決方案。問題只是想出一個我們可以使用函數指針和代碼的情況。函數指針和常規函數的區別

他的例子是這樣的:

#include <iostream> 
using namespace std; 

int dvalue(int x) 
{ 
    return x*x; 
} 
int tvalue(int x) 
{ 
    return x*x*x; 
} 
void printValue(int (*fptr)(int), int x) 
{ 
    cout << fptr(x) << endl; 
} 

int main() 
{ 
int (*pfnc)(int); 
int value = 10; 
pfnc = dvalue; 
printValue(pfnc, 10); 
} 

我的問題是,是,同樣的事情這樣做:

int main() 
{ 
cout << devalue(10) << endl; 
} 

,爲什麼我們使用他們?他們是否使用較少的內存?它是否只是讓我們可以調用一個以上的函數參數或其他功能,使其更簡單? 看來它們更復雜,至少對於一個開始的程序員來說。

回答

1

我的問題是,是,同樣的事情這樣做:[...]

概括地說,是的。

爲什麼我們使用它們?

事實上,我們並不經常使用它們,特別是在C++中。我們在C中更頻繁地使用它們。

儘管如此,理解函數指針是有用的。經典用途的一些示例如下:

+0

所以它沒有必要的東西,只是一件好事,知道未來? – Jeremie

+1

隨着您對類設計的理解,面向對象和抽象的改進,您更可能會看到這樣的概念。 – mungflesh

+1

@ user3289902:有時他們*是必需的,只是不經常。我會認爲它們是C++的一個非常先進的特性,並且不會在早期教它們。另一方面,我希望任何聲稱熟練使用C++的人都能很好地掌握函數指針。 – NPE

1

爲什麼要使用函數指針?

有幾種情況可以使用指向函數的指針。其中最常見的一種 是您正在編寫函數以執行任務(如排序數組)的情況,但您希望用戶爲 能夠定義該任務的特定部分將如何執行 (例如數組是按升序還是降序排序, 的順序)。讓我們仔細看看這個問題,如 專門用於排序,作爲一個例子,可以概括爲 其他類似的問題。

所有排序算法上類似的概念工作:排序算法0​​走過一堆數字,確實對數對 比較,重新排序基於這些 比較的結果的數字。因此,通過改變比較(可以是一個 函數),我們可以改變函數的排序方式,而不會影響排序代碼的其餘部分。

雖然它在分揀經常使用,它有其他用途,如allowing callbacks when loading from a resource like a database.

更簡潔地說,你有能夠通過簡單地指向這些動態引用在運行先前定義的功能利益,當然要打電話給他們。

參考:

http://www.learncpp.com/cpp-tutorial/78-function-pointers/