Java と C++ の両方で、引数を渡すときに、値渡し (PbV) と参照渡し (PbR) の 2 つのオプションがあります。
Java はすべての予備オブジェクトを値で渡し、他のすべてのオブジェクトを参照で渡します。
C++ は、参照渡しが必要でない限り、すべてを値渡ししますが、
- 値渡し
Java と C++ の両方で、値渡しとは、渡されたオブジェクトのコピーを作成することです。関数内でオブジェクトに対して行うことは、関数外の元のオブジェクトには影響しません。例えば、
void foo(aTemp)
{
aTemp = 2;
}
....
int a = 1;
foo(a)
std::cout << a;
出力は 1 になります。
- 参照渡し
参照渡しでは、オブジェクトのコピーは作成されません。オブジェクトの参照のコピーが作成されます。例えば
void foo(&aTemp)
{
aTemp = 2;
}
....
int a = 1;
foo(a)
std::cout << a;
出力は 2 になります。
- より複雑な状況
これまでのところ、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++ のすべての引数は、値 (オブジェクトの値または参照の値) で渡されます。違いは、値を操作する方法だけです。
これは私が通常の仕事から学んだことです。これが役に立てば幸いです。