সি ++ এ কোনও ফাংশনের একটি রেফারেন্স আর্গুমেন্ট ফাংশনটিকে রেফারেন্সটিকে অন্য কোনও কিছুতে রেফারেন্স করার অনুমতি দেয়:
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 দিয়ে একটি নতুন সার্কেল অবজেক্টের জন্য একটি রেফারেন্স বরাদ্দ করা হয়েছে তবে এই পুনরায় নিয়োগের কোনও স্থায়ীত্ব নেই, কারণ রেফারেন্সটি মান দ্বারা পাস হয়েছিল এবং পরিবর্তন করতে পারে না।
আমার কাছে এটি সি ++ রেফারেন্সগুলির মতো মোটেও দেখায় না। এটি নিয়মিত সি ++ রেফারেন্সের সাথে সাদৃশ্যপূর্ণ না কারণ আপনি এটিকে অন্য কোনও বিষয়কে উল্লেখ করতে পারবেন না, এবং এটি সি ++ কনস্ট্রের রেফারেন্সের সাথে সাদৃশ্যপূর্ণ না কারণ জাভাতে, কোডটি যে পরিবর্তিত হবে (তবে বাস্তবে তা নয়) রেফারেন্সটি একটি সংকলন ছুঁড়ে না -সময়ের ত্রুটি।
এটি সি ++ পয়েন্টারগুলির সাথে আচরণে আরও মিল। আপনি এটি পয়েন্টযুক্ত বস্তুর মান পরিবর্তন করতে ব্যবহার করতে পারেন, তবে আপনি কোনও ফাংশনে পয়েন্টারের মানটি পরিবর্তন করতে পারবেন না। এছাড়াও, সি ++ পয়েন্টারগুলির মতো (তবে সি ++ রেফারেন্স সহ নয়) জাভাতে আপনি এই জাতীয় যুক্তির মান হিসাবে "নাল" পাস করতে পারেন।
সুতরাং আমার প্রশ্নটি হল: জাভা কেন "রেফারেন্স" ধারণাটি ব্যবহার করে? এটা কি বোঝা যায় যে তারা সি ++ রেফারেন্সের অনুরূপ নয়? অথবা তারা কি সত্যই সি ++ রেফারেন্সের সাথে সাদৃশ্যপূর্ণ এবং আমি কিছু মিস করছি?