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'
}
अब, जावा के साथ, डॉक्स कहते हैं कि गैर-आदिम प्रकारों के कार्य तर्क संदर्भ हैं। आधिकारिक डॉक्स से उदाहरण:
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. के साथ एक नई सर्कल ऑब्जेक्ट का एक संदर्भ सौंपा गया है। इस पुनर्मूल्यांकन में कोई स्थायित्व नहीं है, हालांकि, संदर्भ मूल्य द्वारा पारित किया गया था और बदल नहीं सकता है।
मेरे लिए यह C ++ संदर्भों की तरह नहीं दिखता है। यह नियमित C ++ संदर्भों से मिलता-जुलता नहीं है क्योंकि आप इसे किसी और चीज़ के संदर्भ में नहीं बना सकते हैं, और यह C ++ कॉन्स्टिट्यूशन के सदृश नहीं है क्योंकि जावा में, वह कोड जो बदल जाएगा (लेकिन वास्तव में नहीं) संदर्भ एक संकलन को नहीं फेंकता है -समय त्रुटि।
यह C ++ पॉइंटर्स के व्यवहार में अधिक समान है। आप इसे पॉइंटेड ऑब्जेक्ट वैल्यू को बदलने के लिए उपयोग कर सकते हैं, लेकिन आप किसी फ़ंक्शन में पॉइंटर के मान को बदल नहीं सकते हैं। इसके अलावा, C ++ पॉइंटर्स के साथ (लेकिन C ++ संदर्भों के साथ नहीं), जावा में आप इस तरह के तर्क के लिए "null" मान के रूप में पास कर सकते हैं।
तो मेरा सवाल है: जावा "संदर्भ" की धारणा का उपयोग क्यों करता है? क्या यह समझा जाए कि वे C ++ संदर्भों से मिलते-जुलते नहीं हैं? या क्या वे वास्तव में सी ++ संदर्भ से मिलते जुलते हैं और मुझे कुछ याद आ रहा है?