2012-10-19 57 views
-4

可能重複:
What are the differences between pointer variable and reference variable in C++?
What does a function prototype mean with an ampersand in it?&C++函數參數列表中的&是什麼意思?

在我的理解,

void bar(int &x) { ... } 

似乎意味着按引用傳遞x。但在C++中,已經有指針等了。那麼,什麼也是有差別的,以

void bar(int *x) { ... } 
// then call by 
bar(&x); 

除了事實,即它的長...我也注意到,如果我用第2種方法,我需要使用->,而不是.如果我通過在struct ..爲什麼?

+1

很多愚蠢。這是一個參考,是的。 –

+1

我看起來你可能不得不閱讀一些關於C++的知識,只是關於「C++引用」的搜索會引導你去閱讀大量優秀的文檔和對這個概念的解釋。 – dweeves

回答

3

Stroustrup介紹引用C++的原因是運算符重載。

http://www.stroustrup.com/bs_faq2.html#pointers-and-references

在你的榜樣作用bar,這也沒什麼大不了的用戶是否有稱其爲bar(&x)(因爲它需要一個指針),也可以與bar(x)調用它(因爲它需要一個參考) 。至少,C程序員認爲它不是。但是,當運算符重載被添加到C++時,Stroustrup認爲使用帶指針的重載運算符是非常不雅的(用他的話來說是「醜陋的」)。

引用在指針的功能上有一些優點,例如臨時對象可以綁定到const引用,但不能將&運算符應用於它。因此,通過const-reference函數有時可以將調用者的一行代碼(創建一個變量)與其通過指針傳遞給const等價物相比較。

因此,一種可能的約定是在函數計劃將地址存儲在某處以供將來使用時返回時使用指針,並在不使用時使用引用。它並不妨礙創建懸掛指針/引用的所有可能的方式,但它捕捉到了一個很大的方法。但是,在編寫功能樣式的代碼時會產生不幸的後果,所以不適合每個人。

我也注意到,如果我使用第二種方法,我需要使用 - >而不是 。如果我傳入一個struct ...爲什麼?

這只是從C .繼承訪問結構的成員,->經由指針到結構來訪問構件的語法。在C你可以只有使用->與LHS指針,你可以從來沒有使用.與LHS指針。所以沒有嚴格的需要不同的符號,它只是幫助使代碼更具可讀性來提醒。例如,如果使用相同的符號.,那麼(*ptr).member意味着與ptr.member相同的情況,這可能會令人困惑。

在C++中,區別對語言有用。您可以爲類類型重載operator->,例如智能指針。但是班級類型可以使用.訪問成員。所以some_smart_ptr->get();表示「在智能指針的參考上調用get()函數」,而some_smart_ptr.get()表示「在智能指針上調用get()函數」。

1

引用基本上是一個帶有常量地址的指針,因此它與地址調用具有相同的效果。它主要是語法的區別:從調用站點開始,通過引用調用更方便,就好像您是按值調用的(除非您必須小心使用臨時對象)。

相關問題