簡體   English   中英

我什么時候應該使用參考?

[英]When should I use a reference?

新手在這里,我正在閱讀一些代碼,有時我看到作者在函數中使用了引用作為

funca (scalar& a)
// Etc

有時候他只是用

funcb (scalar a)
// Etc

有什么不同? 使用參考是我應該養成的良好習慣嗎?

謝謝!

如果調用foo(scalar a) ,則調用者將復制scalar類型的參數a ,而foo將擁有原始對象的COPY。

如果調用foo(scalar &b) ,則參數b只是對原始對象的引用,因此您可以對其進行修改。

使用&name語法通過引用傳遞對象的速度更快,因為它避免了創建給定對象的副本,但是這樣做可能具有潛在的危險,並且有時行為是不需要的,因為您只是想要一個實際的副本。

話雖這么說,實際上有一個選項不允許修改被調用函數的原始對象,卻避免創建副本。 它是foo(const scalar &x) ,它明確指出調用者不希望函數foo修改作為參數傳遞的對象。

可選閱讀,請仔細:

還有一種將參數作為原始指針傳遞的方法,這在現代C ++中非常罕見。 請謹慎使用: foo(scalar *a) 在這種情況下,調用者必須提供對象的地址,而不是對象本身,因此調用者將調用foo(&a) 為了使被調用的函數foo在這種情況下能夠修改對象本身,將需要取消引用指針a ,就像在foo*a = 在這種情況下,變量名前面的星號表示我們不想修改已收到的地址(作為調用函數提供&a的直接結果,即對象a的地址)。

通過引用傳遞參數允許被調用函數以在函數返回后對調用者可見的方式修改其參數,而按值傳遞意味着任何更改都將在范圍上限制於被調用函數。 因此,傳遞(非const)引用通常表示被調用方打算修改自變量,或者(較不常見)將其用作附加的“返回值”。

另外,通過引用傳遞意味着不需要復制參數。 按值傳遞需要這樣的副本(這可能對應用程序的內存占用或運行時性能有害)。 出於這個原因,您經常會看到類類型的參數作為const引用傳遞:被調用者無意修改參數,但也希望避免進行復制。 標量參數的大小很小,因此它們不能從這種方法中受益。

另請參見C ++中的按引用/值傳遞

按值調用( funcb (scalar a) )將為函數提供參數的副本,因此對參數的更改對調用者不可見。

通過引用調用( funcb(scalar& b) )意味着該函數直接對參數進行操作,因此所做的任何更改對調用者都是直接可見的。

通過引用進行呼叫是否是一種良好做法,取決於情況。 如果您需要該函數來修改自變量(以及對調用者可見的修改),則顯然要使用按引用調用。 如果您不想使用非常量引用參數來修改參數,則會引起誤解(因為簽名表明可以更改參數),因此按值調用在此處更為合適。 當然,對於更復雜的類型,按值調用可能會產生不小的開銷。 在這些情況下,最好使用按常量引用調用( funcc(const scalar& c)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM