C ++ 'da bir fonksiyona yapılan referans argümanı, fonksiyonun referansı başka bir şeye yönlendirmesini sağlar:
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;
}
Benzer şekilde, referansı değiştirmeye çalışırsak, bir fonksiyonun sabit bir referans argümanı derleme zamanı hatası verir:
void changeNumberReference(const int& reference) {
reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}
Şimdi, Java ile birlikte, dokümanlar, ilkel olmayan türlerin argümanlarının referans olduğunu söylüyorlar. Resmi belgelerden örnek:
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);
}
Sonra çembere, x = y = 0 olan yeni bir Circle nesnesine bir başvuru atanır.
Bana göre bu C ++ referanslarına hiç benzemiyor. Düzenli C ++ referanslarına benzemiyor çünkü başka bir şeye başvuru yapamıyorsunuz ve C ++ const referanslarına benzemiyor çünkü Java'da değişecek kod (ancak gerçekten yok) başvuru derleme yapmıyor -zaman hatası.
Bu davranış olarak C ++ işaretçilerine benzer. Sivri uçlu nesnelerin değerlerini değiştirmek için kullanabilirsiniz, ancak işaretleyicinin değerini bir işlevde değiştiremezsiniz. Ayrıca, C ++ işaretçilerinde olduğu gibi (ancak C ++ referanslarıyla değil), Java'da böyle bir argüman için "null" değerini geçebilirsiniz.
Öyleyse sorum şu: Java neden "başvuru" kavramını kullanıyor? C ++ referanslarına benzemedikleri anlaşılıyor mu? Yoksa C ++ referanslarına gerçekten benziyorlar mı ve ben bir şeyleri özlüyorum?