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