我真的不知道,是通過引用(或指針傳遞)通有史以來「最佳」的解決方案語義明智?特別是對於原始類型,感覺就像:語義原因傳遞通過引用
int x = 5;
x = foo(x);
比
int x = 5;
foo(x);
我首先想到的代碼需要返回錯誤代碼更自然,但後來我使用異常機制始終是實現理想(?)在此。爲什麼人們希望通過參考來傳遞真實的理由嗎? - 現在讓速度超出範圍。
我真的不知道,是通過引用(或指針傳遞)通有史以來「最佳」的解決方案語義明智?特別是對於原始類型,感覺就像:語義原因傳遞通過引用
int x = 5;
x = foo(x);
比
int x = 5;
foo(x);
我首先想到的代碼需要返回錯誤代碼更自然,但後來我使用異常機制始終是實現理想(?)在此。爲什麼人們希望通過參考來傳遞真實的理由嗎? - 現在讓速度超出範圍。
可以說,對於原始類型來說,通過價值傳遞它們確實更自然。只要看看數學,我們都瞭解數值,並知道我們的意思是將值映射到其他值。
例如,當我們寫sin(x)
,我們真的希望我們的功能sin
來(的)x
值映射到我們簡單地表示sin(x)
另一個值。有時我們想給映射的值賦予不同的名稱,所以我們可以編寫類似y := sin(x)
的文件,並使用y
而不是sin(x)
。
現在如果sin
會採取此參數可以通過引用,sin(x)
將意味着,該的x
值將被映射到sin(x)
和隱含存儲在x
再次 - 這樣的x
舊值會丟失!
在很多情況下,這將會非常令人討厭,因爲我們可能會再次使用「舊」x
- 所以我們必須事先複製它的值。
現在讓我們看看另一方面:OOP。在那裏你想要有物體,比如汽車,而這個物體應該能夠改變。例如汽車可以移動(如果他們有汽油的話),因此他們可以改變他們的位置;駕駛費用燃氣,所以隨着時間的推移油箱將耗盡;你可以打開車門等等...
在這裏,我們不認爲有關汽車映射到另一輛車(複印件),其門打開或它的煤氣罐略有下降,但我們真的想想相同汽車,但現在開着門。
所以又簡稱: - 其最有用的映射值
按值傳遞的時候我們想要的參數不會失去其本義是好的。
通過引用傳遞時,我們希望我們的價值(我們在這裏解釋爲對象),以變化好。
所以語義是很清楚你通常希望通過值使用通/通過引用傳遞,但也存在一些問題,一個可能有路過的價值:
如果您對象是資源,然後通過值傳遞該資源將(可能)意味着,你分配第二個資源!有時這是不可能的 - 例如考慮一下(TCP)網絡連接。如果您已經擁有一個,則無法在同一個端口上打開另一個端口,並在已打開的連接中共享上下文。所以在這種情況下,你真的別無選擇,只能通過引用傳遞你的網絡連接(套接字,數據流,無論什麼)。