कॉल बाय रेफरेंस
यहां हम देखेंगे कि C++ में किसी वेरिएबल का रेफरेंस कैसे पास करें। इसे कभी-कभी "कॉल बाय रेफरेंस" कहा जाता है।
कॉल बाय रेफरेंस मेथड में फ़ंक्शन को आर्गुमेंट्स पास करना, आर्गुमेंट के रेफरेंस को फॉर्मल पैरामीटर में कॉपी करता है। फ़ंक्शन के अंदर, रेफरेंस का उपयोग कॉल में उपयोग किए गए वास्तविक आर्गुमेंट को एक्सेस करने के लिए किया जाता है। इसका मतलब है कि पैरामीटर में किए गए परिवर्तन पास किए गए आर्गुमेंट को प्रभावित करते हैं।
रेफरेंस द्वारा पास करने के लिए सिंटैक्स
// फ़ंक्शन डेफिनिशन: पैरामीटर्स रेफरेंस टाइप हैं
void swap(int &x, int &y) {
int temp;
temp = x; // एड्रेस x पर वैल्यू सेव करें
x = y; // y को x में डालें
y = temp; // x को y में डालें
return;
}
पूर्ण उदाहरण
#include <iostream>
using namespace std;
// फ़ंक्शन डिक्लेरेशन
void swap(int &x, int &y);
int main() {
// लोकल वेरिएबल डिक्लेरेशन
int a = 100;
int b = 200;
cout << "Before swap, value of a: " << a << endl;
cout << "Before swap, value of b: " << b << endl;
// वेरिएबल रेफरेंस का उपयोग करके मानों को स्वैप करने के लिए फ़ंक्शन कॉल करें
swap(a, b);
cout << "After swap, value of a: " << a << endl;
cout << "After swap, value of b: " << b << endl;
return 0;
}
// फ़ंक्शन डेफिनिशन
void swap(int &x, int &y) {
int temp = x;
x = y;
y = temp;
}
आउटपुट
Before swap, value of a: 100 Before swap, value of b: 200 After swap, value of a: 200 After swap, value of b: 100
रेफरेंस पैरामीटर्स के लाभ
- कॉपी से बचाता है: बड़े ऑब्जेक्ट्स के लिए कुशल
- कॉलर को संशोधित करने की अनुमति देता है: आउटपुट पैरामीटर्स के लिए आवश्यक
- पॉइंटर्स से साफ सिंटैक्स: डीरेफरेंसिंग की आवश्यकता नहीं
- नल नहीं हो सकता: वैलिड ऑब्जेक्ट की गारंटी (पॉइंटर्स के विपरीत)
Const रेफरेंस: इनपुट-ओनली पैरामीटर्स
जब आपको ऑब्जेक्ट को संशोधित किए बिना पास करने की आवश्यकता हो (कॉपी से बचने के लिए):
// बड़ा ऑब्जेक्ट पढ़ने के लिए const रेफरेंस
void printInfo(const BigObject& obj) {
// obj को संशोधित नहीं कर सकते - कंपाइल टाइम एरर
cout << obj.getData() << endl;
}
// रेंज-बेस्ड फॉर लूप्स में भी उपयोगी
for (const auto& item : container) { ... }
रेफरेंस vs पॉइंटर पैरामीटर्स
| पहलू | रेफरेंस (T&) | पॉइंटर (T*) |
|---|---|---|
| सिंटैक्स | क्लीनर, कोई * या -> नहीं | डीरेफरेंसिंग आवश्यक |
| नल होने योग्य | नहीं (बिना UB के) | हां |
| रीसीटेबल | नहीं | हां |
| डिफ़ॉल्ट आर्गुमेंट | कठिन | आसान (nullptr) |
| ऑप्शनल पैरामीटर | नहीं | हां |
रेफरेंस वापस करना
// खतरनाक: लोकल वेरिएबल का रेफरेंस न लौटाएं
int& bad() { int x = 5; return x; } // UB!
// ठीक: static/ग्लोबल/मेंबर का रेफरेंस लौटाएं
int& getStaticCounter() {
static int counter = 0;
return counter;
}