5

私は、JavaとC++が引数を渡す方法について少し頭を悩ませ始めました。

これは正しいです:

Javaは値による呼び出しを使用して渡されます、値は実際には参照です(実際のデータ/オブジェクトではありません)。それで、アドレスのコピーが作成されますか?

C ++はデフォルトで値を渡しますが、値は参照ではなく、実際のデータです。&参照使用またはポインタによる実際の呼び出しをシミュレートしたい場合は?

要約すると、Javaはパラメーターのコピーを作成しますが、これは参照のコピーです。C ++は通常&、実際の基になるデータのコピーを作成しますが、参照(またはポインターを使用しない限り)のコピーは作成しませんか?

4

5 に答える 5

3

C ++(03)は、参照渡しをしない限り、常にコピーを作成します。(理論的には...実際には、コピーの省略発生する可能性がありますが、質問に関しては関係ありません)

ポインターを渡す場合でも、コピーを作成します(もちろん、ポインターのコピーですが、それでもコピーです)。

于 2012-06-20T15:31:04.557 に答える
2

あなたの要約は正しいです。

個人的には、Java と C++ を比較すると、非プリミティブ型が値によってポインターとして渡される場合、Java を C++ と同等と見なす方が簡単だと思います。Java では、ポインターが表示されず、操作できません。

于 2012-06-20T15:53:38.217 に答える
1

Java の要約は正しいです。実際、非参照型にも適用されます。

于 2012-06-20T15:42:16.357 に答える
0

それは正しいです。また、Java は実際にはプリミティブ型 (int、char、double、float、short、long、boolean、および byte) のコピーを作成しますが、プリミティブ型の配列 (int[]、char[] など) は作成しないことに注意してください。参照によって渡されます) またはラッパー クラス (プリミティブ型を含むオブジェクトである Integer や Double など)。関数内の引数のローカル コピーがプリミティブ型であり、呼び出し元の関数の引数のコピーが変更されない場合は、その引数のローカル コピーに対して任意の操作を行うことができます。

于 2012-06-20T15:53:13.783 に答える
0

Java と C++ の両方で、引数を渡すときに、値渡し (PbV) と参照渡し (PbR) の 2 つのオプションがあります。 Java はすべての予備オブジェクトを値で渡し、他のすべてのオブジェクトを参照で渡します。 C++ は、参照渡しが必要でない限り、すべてを値渡ししますが、

  1. 値渡し

Java と C++ の両方で、値渡しとは、渡されたオブジェクトのコピーを作成することです。関数内でオブジェクトに対して行うことは、関数外の元のオブジェクトには影響しません。例えば、

void foo(aTemp)
{
aTemp = 2;
}
....
int a = 1;
foo(a)
std::cout << a;

出力は 1 になります。

  1. 参照渡し

参照渡しでは、オブジェクトのコピーは作成されません。オブジェクトの参照のコピーが作成されます。例えば

void foo(&aTemp)
{
aTemp = 2;
}
....
int a = 1;
foo(a)
std::cout << a;

出力は 2 になります。

  1. より複雑な状況

これまでのところ、Java と C++ の間に大きな違いはありません。ただし、渡されたオブジェクトを新しいオブジェクトに割り当てると、状況は異なります。たとえば、C++ では、

 void foo(&aTemp)
 {
 myClass b(2);
 aTemp = b;
 }
 ...    
 myClass a(1);
 foo(a)
 std::cout << a;

出力は 2 になります。

ただし、ジャバでは

void foo(aTemp)
{
myClass b = new myClass(2);
aTemp = b;
}
...
myClass a = new myClass(1);
foo(a)
std::cout << a;

出力は 1 になります。

ここでの出力の違いは、java と c++ の "=" の違いによるものです

c++ では、"=" を不規則な方法でオーバーライドしないと、myClass b の値が a を指す aTemp にコピーされます。

Java では、aTemp = b を実行すると、オブジェクト b のアドレスが aTemp に割り当てられるため、aTemp は元の a を指しなくなり、aTemp に対して何を行っても、a に影響を与えなくなります。

つまり、Java と C++ のすべての引数は、値 (オブジェクトの値または参照の値) で渡されます。違いは、値を操作する方法だけです。

これは私が通常の仕事から学んだことです。これが役に立てば幸いです。

于 2017-10-13T08:40:43.840 に答える