2010-12-19 50 views
2

我在過去的幾天裏一直在教自己的C++,並遇到了一些我可以使用一些進一步解釋的情況。除了顯而易見的類,命名等之外,下列方法還有什麼區別?我對存儲器指針有點困惑

void OnTimer(wxTimerEvent &event) ... 

void addNPC(Sprite *spr) ... 

這兩種方法都接收通過引用傳遞的值並做同樣的事情?如果是這樣,有什麼區別?當我剛開始讀,我看到了這樣調用方法:

addNPC(&sprite); 

所以我認爲當你在方法參數中寫道,將接收內存指針的方法,你必須把它寫像你聲明一個內存指針/位置,而不僅僅是一個值。但後來我看着OnTimer方法,並且我看到它也有一個參考被傳遞。有什麼不同?

最後,這兩件事情是一樣的,只是實際的編碼風格?

void addNPC(Sprite& spr) ... 
void addNPC(Sprite &spr) ... 
+0

作業? ------ :-) – 2010-12-19 17:31:15

+0

我猜不是:-) – anatolyg 2010-12-19 17:34:03

+0

哈。不,從未做過C++。並做了非常簡單的工作,使其陷入。 – Nathan 2010-12-19 17:36:02

回答

1
void addNPC(Sprite *spr) 

在上面的代碼中,您需要像下面那樣傳遞Sprite對象的地址,因爲它接收指針。

addNPC(&sprite); 

而對於功能

void OnTimer(wxTimerEvent &event) 

呼叫必須是象下面這樣,因爲它需要參照wxTimerEvent對象。

wxTimerEvent evt; 
OnTimer(evt);//Passing object by reference. 

在調用的地方,語法是相同爲 兩個傳值和由 引用傳遞。

對於你最後的問題,它們都是相同的,只是編碼風格的差異。

4

最後一個問題:兩個函數原型是等價的。空格在C或C++中通常不重要。

至於引用和指針之間的區別,可以將引用看作指針的「語法糖」,並且附加的限制是它不能爲NULL。有關詳細信息,請參閱C++ FAQ:https://isocpp.org/wiki/faq/references

+1

請**不要**嘗試從現有的指針理解中獲得對引用的理解。如果有的話應該是相反的。當你添加足夠的「except」到你的指針派生參考的心智模型是非常準確的時候,你並沒有比你開始的更好。但**做**請參閱鏈接 - 那裏的頂尖材料。 – 2010-12-19 17:28:44

+0

如果你是來自另一種編程語言,你可能會認爲從引用的角度來看指針是最好的。我自學成才,硬件到操作系統,所以指針是第一位的(特別是因爲直到後來我才被暴露給默認的參考語言)。 – 2010-12-19 17:37:19

+0

感謝您的鏈接。我一直在想我有一些倒退的開始。 :) – Nathan 2010-12-19 17:40:31

1

wxTimerEvent &event是對對象的引用。它的行爲看起來像一個普通的變量,但它引用了函數外的變量。對本地引用所做的任何更改實際上都會更改原始內容。它本質上是一個可以作爲普通變量訪問的指針,它不能是NULL

Sprite *spr是一個真正的指向外部變量的指針。在本地進行的任何更改也在功能外進行。它可以是NULL

最後兩項是相同的。 C/C++代碼中的空間不重要。

1

除了其他答案,還有一個const引用的特性 - 您可以爲其指定臨時對象,只要const引用處於活動狀態,對象就會存活。

string its_alive(); 

void foo() { 
    const string& some_string = its_alive(); 
    ... 
} 

因此,如果引用的用戶不負責對象的銷燬並且NULL對象沒有任何意義,那麼您可以使用引用。

這裏的榮譽GotW #88用於解釋對臨時對象的const引用。