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;は、参照が指す中身が固定。