0

私は本当に疑問に思っています.参照渡し(またはポインタを渡す)は、意味的に賢明な「最良の」ソリューションですか?特にプリミティブ型の場合は次のようになります。

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

よりも自然です

int x = 5;
foo(x);

私は最初、エラー コードを返す必要があるコードについて考えましたが、例外メカニズムを使用することが常に (?) これよりも望ましいことに気付きました。参照渡しをしたい本当の理由はありますか? - 今のところ、速度は範囲外です。

4

1 に答える 1

1

ほぼ間違いなく、プリミティブ型の場合、実際には値で渡す方が自然です。数学を見るだけで、私たちは皆、値を理解し、値を他の値にマッピングすることによって何を意味するかを知っています.

たとえば、 を書くとき、関数が値 (の)を別の値にマップするsin(x)ことを本当に望んでいます。マップされた値に別の名前を付けたい場合があるため、次のように記述して代わりに使用できます。sinxsin(x)y := sin(x)ysin(x)

sinこのパラメータを参照sin(x)渡しすると、 の値xが にマップされsin(x)、暗黙的に再度格納されることになります。xそのため、 の古い値はx失われます。

多くの場合、「古い」値を再度使用する必要があるため、これは非常に面倒ですx。そのため、事前にその値をコピーする必要があります。

もう一方の手を見てみましょう: OOP. たとえば、車などのオブジェクトが必要な場合、このオブジェクトは変更できる必要があります。たとえば、車は (ガスがある場合) 移動できるため、位置を変更できます。運転にはガソリン代がかかるため、ガソリンタンクは時間の経過とともに枯渇します。ドアなどを開けることができます...

ここでは、車を別の車 (コピー) にドアを開けた状態またはガソリン タンクをわずかに減らした状態でマッピングすることについては考えていませんが、ドアが開いている同じ車について実際に考えています。


もう一度簡単に言うと:

  • 値渡しは、引数が元の意味を失わないようにしたい場合に適しています。値のマッピングに最も役立ちます。

  • 参照渡しは、値 (ここではオブジェクトとして解釈します) を変更したい場合に適しています。


したがって、意味的には、値渡し/参照渡しを通常何に使用するかは非常に明確ですが、値渡しで発生する可能性のある問題がいくつかあります。

オブジェクトがresourceの場合、そのリソースを値で渡すことは、(おそらく) 2 番目のリソースを割り当てることを意味します! これは、単純に不可能な場合があります。たとえば、(TCP) ネットワーク接続について考えてみてください。既に 1 つある場合、同じポートで別のポートを開くことはできず、既に開いている接続でコンテキストを共有します。したがって、そのような場合は、ネットワーク接続 (ソケット、データ ストリームなど) を参照渡しするしかありません。

于 2012-04-30T10:38:34.560 に答える