2014-10-04 104 views
1

在什麼情況下,最好返回一個對象而不是僅僅修改通過引用傳遞給該函數的對象?我怎麼知道我應該選擇哪一個?函數返回值vs修改通過引用傳遞的值

實際上,問題是如果沒有從函數返回對象的能力,而是隻修改通過引用傳遞的對象,我就無法做到這些事情。

+0

您可以返回一個不可變對象,但不能(按定義)修改通過引用傳入的對象。 – 2014-10-04 14:06:04

+1

相關:http://stackoverflow.com/questions/321068/returning-multiple-values-from-ac-function – 2014-10-04 14:06:35

+2

通過值返回函數的「結果」被認爲是「更乾淨」,因爲它符合功能,並可以產生更方便的代碼。但是,如果創建對象的開銷很大,則通過將對象作爲引用存儲來重新使用對象,可以提高性能。 – 2014-10-04 14:07:47

回答

1

返回一些東西是簡單的選擇,但是如果有事情說出來,你會使用參考。其中一個原因是因爲您對返回值有其他想法,比如成功/失敗代碼。另一個是因爲它看起來很大,而且你在一臺小電腦上。然後,當然,您可能需要修改現有的變量或結構,而不是創建新的變量或結構。我認爲就是這樣。

我不知道任何你不能通過傳遞一個引用或指針來接收結果。

+0

還有一個原因:如果忽略返回值是一個可怕的錯誤,那麼在C++中,通過引用獲取參數和以這種方式「返回」結果可能會更好。這是因爲不幸的是GCC的'warn_unused_result'屬性在C++中不起作用,並且對於某些函數忽略返回值是一個糟糕的錯誤。例如'system()'就是這樣的,但用戶庫中的其他函數可能會更糟糕(我已經看到了一些,例如結果是RAII類型,其刪除將「撤消」函數調用,像一個Python上下文管理器)。 – 2014-10-04 14:15:15

3

主要務實差

之間
TYPE function() ; 

void function (TYPE &value) ; 

在於前者可以在表達式中使用。

a = 10 * function() ; 

如果(函數()){ }

即主要的設計考慮因素。

除此之外,我將不得不進入意見。我將堅持客觀的區別。

+0

這就是我一直在想的。運營商就是一個很好的例子。這些通常會改變事物並返回結果。沒有它們,就不可能用傳統的可讀形式編寫矢量代數。 – Tobias 2014-10-04 14:26:24

2

它非常簡單...

返回的「價值」: - 如果你想與對象的當前狀態的對象的副本; - 如果原始對象的狀態改變後者,那麼inst很重要;

返回參考: - 如果您希望在對象被其他人更新時具有正確的狀態; - 如果您想更改對象的狀態,並且其他人知道該更改;

這些是最重要的原因。

但存在就必須意識到一個特殊用例:

通過techinical原因,目前語言通常是更快,當你通過引用返回。 如果速度是一個要求,你也應該考慮這個約束來做出最好的決定。

但是基本的決定是關於你想如何處理對象的狀態。