2012-04-30 76 views
0

我真的不知道,是通過引用(或指針傳遞)通有史以來「最佳」的解決方案語義明智?特別是對於原始類型,感覺就像:語義原因傳遞通過引用

int x = 5; 
x = foo(x); 

int x = 5; 
foo(x); 

我首先想到的代碼需要返回錯誤代碼更自然,但後來我使用異常機制始終是實現理想(?)在此。爲什麼人們希望通過參考來傳遞真實的理由嗎? - 現在讓速度超出範圍。

回答

1

可以說,對於原始類型來說,通過價值傳遞它們確實更自然。只要看看數學,我們都瞭解數值,並知道我們的意思是值映射到其他值。

例如,當我們寫sin(x),我們真的希望我們的功能sin來(的)x值映射到我們簡單地表示sin(x)另一個值。有時我們想給映射的值賦予不同的名稱,所以我們可以編寫類似y := sin(x)的文件,並使用y而不是sin(x)

現在如果sin會採取此參數可以通過引用,sin(x)將意味着,該的x值將被映射到sin(x)和隱含存儲在x再次 - 這樣的x舊值會丟失!

在很多情況下,這將會非常令人討厭,因爲我們可能會再次使用「舊」x - 所以我們必須事先複製它的值。

現在讓我們看看另一方面:OOP。在那裏你想要有物體,比如汽車,而這個物體應該能夠改變。例如汽車可以移動(如果他們有汽油的話),因此他們可以改變他們的位置;駕駛費用燃氣,所以隨着時間的推移油箱將耗盡;你可以打開車門等等...

在這裏,我們不認爲有關汽車映射到另一輛車(複印件),其門打開或它的煤氣罐略有下降,但我們真的想想相同汽車,但現在開着門。


所以又簡稱: - 其最有用的映射

  • 按值傳遞的時候我們想要的參數不會失去其本義是好的。

  • 通過引用傳遞時,我們希望我們的價值(我們在這裏解釋爲對象),以變化好。


所以語義是很清楚你通常希望通過值使用通/通過引用傳遞,但也存在一些問題,一個可能有路過的價值:

如果您對象是資源,然後通過值傳遞該資源將(可能)意味着,你分配第二個資源!有時這是不可能的 - 例如考慮一下(TCP)網絡連接。如果您已經擁有一個,則無法在同一個端口上打開另一個端口,並在已打開的連接中共享上下文。所以在這種情況下,你真的別無選擇,只能通過引用傳遞你的網絡連接(套接字,數據流,無論什麼)。