ほぼ間違いなく、プリミティブ型の場合、実際には値で渡す方が自然です。数学を見るだけで、私たちは皆、値を理解し、値を他の値にマッピングすることによって何を意味するかを知っています.
たとえば、 を書くとき、関数が値 (の)を別の値にマップするsin(x)
ことを本当に望んでいます。マップされた値に別の名前を付けたい場合があるため、次のように記述して代わりに使用できます。sin
x
sin(x)
y := sin(x)
y
sin(x)
sin
このパラメータを参照sin(x)
渡しすると、 の値x
が にマップされsin(x)
、暗黙的に再度格納されることになります。x
そのため、 の古い値はx
失われます。
多くの場合、「古い」値を再度使用する必要があるため、これは非常に面倒ですx
。そのため、事前にその値をコピーする必要があります。
もう一方の手を見てみましょう: OOP. たとえば、車などのオブジェクトが必要な場合、このオブジェクトは変更できる必要があります。たとえば、車は (ガスがある場合) 移動できるため、位置を変更できます。運転にはガソリン代がかかるため、ガソリンタンクは時間の経過とともに枯渇します。ドアなどを開けることができます...
ここでは、車を別の車 (コピー) にドアを開けた状態またはガソリン タンクをわずかに減らした状態でマッピングすることについては考えていませんが、ドアが開いている同じ車について実際に考えています。
もう一度簡単に言うと:
したがって、意味的には、値渡し/参照渡しを通常何に使用するかは非常に明確ですが、値渡しで発生する可能性のある問題がいくつかあります。
オブジェクトがresourceの場合、そのリソースを値で渡すことは、(おそらく) 2 番目のリソースを割り当てることを意味します! これは、単純に不可能な場合があります。たとえば、(TCP) ネットワーク接続について考えてみてください。既に 1 つある場合、同じポートで別のポートを開くことはできず、既に開いている接続でコンテキストを共有します。したがって、そのような場合は、ネットワーク接続 (ソケット、データ ストリームなど) を参照渡しするしかありません。