我真的很想知道,是通过引用(或传递一个指针)从语义上明智的“最佳”解决方案?特别是对于原始类型,感觉就像:
int x = 5;
x = foo(x);
比
更自然int x = 5;
foo(x);
我首先想到了需要返回错误代码的代码,然而我意识到使用异常机制总是(?)优于此。是否有人希望通过引用传递真正的原因? - 暂时让速度超出范围。
答案 0 :(得分:1)
可以说,对于原始类型,按值传递它们更自然。只看数学,我们都对价值观有所了解,并且知道映射值对其他值的意义。
例如,当我们写sin(x)
时,我们真的希望我们的函数sin
将值{of} x
映射到另一个值,我们只是表示sin(x)
。有时我们希望为映射值指定不同的名称,因此我们可以编写类似y := sin(x)
的内容并使用y
代替sin(x)
。
现在,如果sin
将参考引用此参数,则sin(x)
将表示x
的值将映射到sin(x)
并隐含地存储在{x
中1}}再次 - 所以x
的旧值会丢失!
在许多情况下,这会非常烦人,因为我们可能想要使用" old" x
再次 - 所以我们必须事先复制它的值。
现在让我们看看另一只手:OOP。你想拥有对象,例如汽车,这个对象应该能够改变。例如汽车可以移动(如果他们有汽油),因此他们可以改变他们的位置;驱动燃气成本,因此燃气罐会随着时间的推移而耗尽;你可以打开门等等......
在这里,我们没有考虑将车辆开到另一辆车(副本),车门打开或油箱略有下降,但我们真的想到相同的车,但是现在打开门。
简而言之:
传递值是好的 - 它对映射值最有用。
通过引用传递是好的,我们希望我们的值(我们在此解释为对象)更改。
从语义上来说,很明显你通常想要使用的是传递值/传递引用,但是传递值可能会遇到一些问题:
如果您的对象是资源,那么按值传递该资源(可能)意味着您要分配第二个资源!这有时根本不可能 - 例如考虑(TCP)网络连接。如果您已经拥有一个,则无法在同一端口上打开另一个端口,在已打开的连接中共享上下文。所以在这种情况下你真的别无选择,只能通过引用传递你的网络连接(套接字,数据流等)。