Javaの参照型
Javaには、いわゆる参照渡しは存在しない。
参照型は、C++の参照とは異なる。
Javaの参照型は、参照値の値渡しをしている。JLS - 4.3.1
どちらかというと、C++のポインタに近いと言える。 つまり、値が入っている場所を渡している。 C++の参照は、ある変数の別名であるので、まったくの別物である。
ここでC++の復習
C++の参照は初期化時に、どの変数の参照かが固定される。
int a = 100; int &b = a; // 変数bは変数aの参照で固定
後でこの参照関係(変数bは変数aの参照である)を変えることができない。
後で変えたと思ったものは、初期化時に指定した変数の値を変えることを意味する。
int a = 100; int &b = a; cout << "a := " << a << endl; // a := 100 cout << "b := " << b << endl; // b := 100 b += 5; cout << "a := " << a << endl; // a := 105 cout << "b := " << b << endl; // b := 105 int c = 10; a = c; cout << "a := " << a << endl; // a := 10 cout << "b := " << b << endl; // b := 10
ポインタや参照を使うときは、constを積極的に使うべき。 変更されてもいいものだけconstを外すようにする。
const int* a;
は、ポインタが指す中身が固定。
int* const a;
は、ポインタそのものが固定。
const int &b = a;
は、参照が指す中身が固定。