2010-06-17 50 views
1

我遇到這樣一類問題:操作員及和*在函數原型

class Sprite { 
    ... 
     bool checkCollision(Sprite &spr); 
    ... 
}; 

所以,如果我有課,我可以這樣做:

ball.checkCollision(bar1); 

但是,如果我改變類這樣:

class Sprite { 
    ... 
     bool checkCollision(Sprite* spr); 
    ... 
}; 

我必須這樣做:

ball.checkCollision(&bar1); 

那麼,有什麼區別?這是更好的方式,而不是其他?

謝謝。

+0

請參閱http://stackoverflow.com/questions/3063514/what-does-it-mean-to-pass-a-variable-to-a-function-e-g-string-insert-size稍早發佈。 – 2010-06-17 21:42:24

回答

4

在這兩種情況下,你實際上是通過BAR1的地址(和你沒有複製的值),因爲這兩個指針(雪碧*)和引用(雪碧&)有引用語義,在第一種情況下明確(你必須明確地解引用指針來操作指向的對象,並且你必須明確地將對象的地址傳遞給指針參數),第二種情況是隱式的(當你操縱一個引用時它就是就好像你是操縱對象本身,因此它們具有值語法,並且調用者的代碼不會使用運算符顯式傳遞指針)。因此,指針和引用之間的巨大差異在於你可以對指針/引用變量進行什麼操作:指針變量本身可以被修改,所以它們可以被改變爲指向別的東西,可以是NULL,增加,遞減等,因此指針上的活動(即直接訪問變量名稱)和指向的對象(使用*操作符訪問)之間存在強烈的分離 - 或者,如果要訪問成員,用 - >快捷鍵)。

參考文獻的目的僅僅是指向它們指向的對象的別名,並且不允許對引用本身進行更改:使用它們所引用的對象初始化它們,然後它們的行爲就好像它們是這樣反對他們的一生。

一般來說,在C++中,引用優於指針,因爲我所說的動機和其他一些可以在C++ FAQ的appropriate section中找到的引用。

就性能而言,它們應該是相同的,因爲參考實際上是變相的指針;但是,在代碼使用引用而不是指針的情況下,編譯器可能會優化更多的情況,因爲引用可以保證不會改變它們隱藏的地址(即從他們的生命的開始到結束他們總是指向相同的對象),所以在某些奇怪的情況下,您可能會使用引用獲得某些性能,但同樣,使用引用的關鍵點是關於良好的編程風格和可讀性,而不是性能。

+1

引用和指針不具有相同的語義。例如,考慮分配。 – 2010-06-17 21:45:46

+0

你是對的;我會編輯我的答案。 – 2010-06-17 21:47:30

+0

謝謝你,所以我會用Sprite * spr;因爲我看得更清楚。 – Puyover 2010-06-17 21:50:49

1

引用不能爲空。一個指針可以。

如果您不想允許在您的函數中傳遞空指針,請使用引用。

+0

哦,好的,但另有說法,一種方法比另一種更快或更有效? – Puyover 2010-06-17 21:42:27

+0

如果你傳遞一個指針,並且你想編寫健壯的代碼,那麼你必須檢查它是否爲null。如果您使用參考,則不需要進行檢查。 – 2010-06-17 21:48:06

+2

@Puyover:速度應該是你最後的擔憂。學習語言更重要。 – GManNickG 2010-06-17 22:05:55

0

它們都做(本質上)同樣的事情 - 它們通過引用將對象傳遞給函數,以便只複製對象的地址。這是有效的,並且意味着該功能可以改變對象。

在簡單的情況下,你給他們是等價的。

主要區別在於引用不能爲null,因此您不必在函數中測試null,但是如果沒有對象的情況有效,您也不能傳遞null對象。

有些人也不喜歡傳引用版本,因爲它在調用代碼中並不明顯,因爲您傳入的對象可能會被修改。一些編碼標準建議您只將const引用傳遞給函數。

0

有了指針,你需要特別讓編譯器知道你想通過引用傳遞對象的地址,編譯器已經知道你想要的ptr。兩者都可以,這是一個品味的問題,我個人不喜歡引用,因爲我喜歡看看發生了什麼,但那只是我。

+2

有些地方在C++中,它不是一個品味的問題 - 只有一個參考將做。例如,作爲複製構造函數的參數。 – 2010-06-17 21:52:44