2010-04-06 77 views
19

我想請教一下指針在C++C++指針功能,初學者問

我有一些簡單的代碼:

int add(int a, int b){ 
return a+b; 
} 

int runner(int x,int y, int (*functocall)(int, int)){ 
return (*functocall)(x,y); 
} 

現在,假設我把使用這樣的功能:

cout<<runner(2,5,&add); 

也許

cout<<runner(2,5,add); 

有什麼區別?因爲當我嘗試時,結果是一樣的,沒有錯誤。

非常感謝

回答

0

相信第二呼叫自動解析爲在編譯器中第一呼叫...

+0

所以你的意思是,第二個電話是正確的? – BobAlmond 2010-04-06 17:20:45

+1

不,我的意思是說,編譯器解析了對函數指針的調用,這實際上是一個語法偏好問題。 – 2010-04-06 17:22:44

10

功能將根據C++標準(4.3/1)被隱式澆鑄的指針。沒有區別。但是,此轉換從不適用於非靜態成員函數。對於他們,你應該明確地寫下&

3

沒有區別。爲了與其他獲取指針的方法保持一致,您可以使用&,但名稱本身沒有其他含義,因此它被假定爲「獲取地址」。

這與數組變量名稱非常類似,它充當數組第一個元素的地址。

0

這是因爲不存在這樣的對象(在表達式換算)爲功能,只有函數指針。當你想通過函數到你的功能你其實可以通過的僅僅是指針,所以編譯器這個塑像爲您

+0

有些對象叫做函數(用表達式來說):'add'就是這樣一個對象,它的類型是'int(int,int)'。儘管如此,它們在很多情況下都暗指衰敗。 – avakar 2010-04-06 18:50:13

+0

請舉例說明函數和作爲表達式的指針真的不同 – Andrey 2010-04-06 19:20:49

+0

是的,函數不是對象,但它們是函數(驚喜xD)。例如'void f(){} void(&fr)()= f;'因爲f是函數類型的表達式,並且你將引用綁定到它,而void(&fr)()=&f;'不因爲'&f'是指針類型的表達式。另一個例子 - 嘗試'sizeof(f)'並注意它失敗,因爲函數沒有大小。像@avakar所說的,這裏的f類型是'void()',add的類型是'int(int,int)' – 2010-04-06 21:18:48

3

沒有,在這種特殊情況下是沒有區別的。任何一個給你的函數的地址。

但是請注意,在C++中,獲得一個指向成員功能需要您使用「&」操作。

1

注意,因爲你嘗試函數引用綁定到一個指針,而不是給一個函數,你可以有功能

int runner(int x,int y, int (&functocall)(int, int)){ 
return functocall(x,y); 
} 

現在有了&add調用它不再有效引用。有時,這種使用模板

template<typename T> 
int runner(int x,int y, T &functocall, T otherfunc){ 
return functocall(x,y) + otherfunc(y, x); 
} 

即時與runner(10, 20, add, add)調用它會失敗,因爲T是試圖推導出這兩個函數指針和函數型(無腐爛的指針傳遞給一個參考時所做的彪炳參數!)。