C ++では、関数への参照引数により、関数が参照を他のものに参照させることができます。
int replacement = 23;
void changeNumberReference(int& reference) {
reference = replacement;
}
int main() {
int i = 1;
std::cout << "i=" << i << "\n"; // i = 1;
changeNumberReference(i);
std::cout << "i=" << i << "\n"; // i = 23;
}
同様に、関数への定数参照引数は、参照を変更しようとするとコンパイル時エラーをスローします。
void changeNumberReference(const int& reference) {
reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}
さて、Javaでは、ドキュメントは非プリミティブ型の関数引数は参照であると言います。公式ドキュメントの例:
public void moveCircle(Circle circle, int deltaX, int deltaY) {
// code to move origin of circle to x+deltaX, y+deltaY
circle.setX(circle.getX() + deltaX);
circle.setY(circle.getY() + deltaY);
// code to assign a new reference to circle
circle = new Circle(0, 0);
}
次に、円にx = y = 0の新しいCircleオブジェクトへの参照が割り当てられます。ただし、参照は値によって渡され、変更できないため、この再割り当てには永続性がありません。
私にとって、これはC ++の参照のようには見えません。他の何かを参照させることができないため、通常のC ++参照に似ていません。また、Javaでは参照を変更するコード(実際にはそうではない)がコンパイルをスローしないため、C ++ const参照に似ていません時間エラー。
これは、動作がC ++ポインターに似ています。これを使用して、ポイントされたオブジェクトの値を変更できますが、関数内でポインターの値自体を変更することはできません。また、C ++ポインター(C ++参照ではない)と同様に、Javaでは、そのような引数の値として「null」を渡すことができます。
だから私の質問は:なぜJavaは「参照」の概念を使用するのですか?C ++の参照に似ていないことを理解する必要がありますか?または、実際にC ++の参照に本当に似ており、何かが欠けていますか?