传递引用的语义原因

时间:2012-04-30 10:03:19

标签: pass-by-reference pass-by-value

我真的很想知道,是通过引用(或传递一个指针)从语义上明智的“最佳”解决方案?特别是对于原始类型,感觉就像:

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

更自然
int x = 5;
foo(x);

我首先想到了需要返回错误代码的代码,然而我意识到使用异常机制总是(?)优于此。是否有人希望通过引用传递真正的原因? - 暂时让速度超出范围。

1 个答案:

答案 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)网络连接。如果您已经拥有一个,则无法在同一端口上打开另一个端口,在已打开的连接中共享上下文。所以在这种情况下你真的别无选择,只能通过引用传递你的网络连接(套接字,数据流等)。