5

私はそれを読んだ:

Java では、すべてのパラメーターが値渡しされます。C++ では、次の方法でパラメーターを渡すことができます。

value,
reference, or
const-reference

ただし、関数にポインターを渡し、その関数でポインターを変更した場合、パラメーターとして指定するために使用された識別子を持つオブジェクトは変更されず、関数に渡されたポインターのみが変更されます。

これは実際には、技術的には、C++ ではすべてが COPY として値によって渡されることを意味します。違いは、このコピーされた値をメモリ アドレス (ポインターまたは参照) として使用できることです。そのため、関数として渡された既存のポインターを変更したい場合パラメータには、そのポインタが保持するメモリ アドレスの値ではなく、そのメモリ アドレスの値を渡す必要があります。

では、すべての関数パラメーターは、単一の特定の呼び出しでパラメーターとして機能するように特別に作成された既存のオブジェクトから派生した新しいコピーであり、実際の既存のオブジェクトは決して正しいものではないという仮定はありますか?

4

3 に答える 3

0

関数に渡されるものは、実際には一意のオブジェクトです。ただし、 がobject Xあり、参照を作成しobject& Y = X;、次にを取得するとobject& Z = X;、3 つの「オブジェクト」が作成されます。これらはXobjectでありYZ型は への参照型objectです。object-の「実際の」インスタンスはまだ 1 つしかなくYZ両方とも同じ を参照していXます。

同様に、関数への参照を渡す場合:

void func(object& R)
{
  ...
}

func(X);

関数は、への参照であるオブジェクトを受け取ります。Xこれにより、関数は実際に を変更しているかのように見えます。これがX参照の仕組みであるためです。参照の実際の値は、元のオブジェクトを参照するものです。

私が言おうとしているのは、「関数に渡されるものはすべて一意のオブジェクトですが、参照の場合は同じ元のオブジェクトを参照している可能性がある」ということです。

C++ では、ポインターと参照は次の 2 つの点を除いて非常によく似ています。 「何もない」または「まだ設定されていません」を参照する参照があります [ただし、最初に参照していたオブジェクトが存在しない「古い」参照を持つことはできます]。2. 参照は、基本オブジェクトと同じ構文を使用します。たとえばr.member = 42;、ポインタが*porを使用p->member = 42;してオブジェクトのコンテンツを「取得」する場合です。

[はい、C++ 仕様内で、ポインターと参照が「内部的に同じではない」コンパイラーを定義することは完全に可能ですが、これまでのところ見たことがありません]

于 2013-11-03T11:25:23.250 に答える