अंतर की व्याख्या
यहां हम देखेंगे कि C या C++ में int और const int& में क्या अंतर है।
int (वैल्यू टाइप)
- इंटीजर टाइप डेटा का टाइप है
- वैल्यू सीधे स्टोर करता है
- कॉपी सेमेन्टिक्स: पास करने पर कॉपी बनती है
- आकार: आमतौर पर 4 बाइट्स (32-बिट)
const int& (कॉन्स्टेंट रेफरेंस टू इंट)
constकिसी चीज को कॉन्स्टेंट बनाने के लिए उपयोग किया जाता हैint&इंट टाइप डेटा का रेफरेंस रखता है- यह रेफरेंस मान स्वयं कॉन्स्टेंट है (रेफरेंस को रीबाइंड नहीं किया जा सकता)
constयहां रिडंडेंट है क्योंकि रेफरेंस वैसे भी रीबाइंड नहीं किए जा सकते- कंपाइलर वार्निंग या एरर दे सकता है
const int& vs int const&
const int& int const& के समान है। दोनों एक कॉन्स्टेंट इंटीजर के रेफरेंस को संदर्भित करते हैं। रेफरेंस के माध्यम से इंटीजर को संशोधित नहीं किया जा सकता।
व्यावहारिक अंतर
फ़ंक्शन पैरामीटर्स में
// वैल्यू द्वारा पास - कॉपी बनाता है
void byValue(int x) {
x = 10; // केवल लोकल कॉपी बदलता है
}
// कॉन्स्ट रेफरेंस द्वारा पास - कोई कॉपी नहीं, रीड-ओनली एक्सेस
void byConstRef(const int& x) {
// x = 10; // त्रुटि: const ऑब्जेक्ट को संशोधित नहीं कर सकते
// लेकिन बड़ा ऑब्जेक्ट कॉपी नहीं होता
}
// नॉन-कॉन्स्ट रेफरेंस - कॉलर को संशोधित करने की अनुमति
void byRef(int& x) {
x = 10; // कॉलर का वेरिएबल बदलता है
}
उपयोग दिशानिर्देश
| स्थिति | अनुशंसित | कारण |
|---|---|---|
| छोटे टाइप्स (int, float, char) | वैल्यू द्वारा (int) | कॉपी सस्ती है, सरल |
| बड़े ऑब्जेक्ट्स (क्लास, स्ट्रक्चर) | कॉन्स्ट रेफरेंस (const T&) | कॉपी से बचाता है, रीड-ओनली |
| कॉलर को संशोधित करने की आवश्यकता | नॉन-कॉन्स्ट रेफरेंस (T&) | आउटपुट पैरामीटर |
| मूव सेमेन्टिक्स (C++11) | वैल्यू द्वारा + std::move | कॉपी एलिजन, मूव ऑप्टिमाइज़ेशन |
const int& का विशेष मामला
void func(const int& x); func(10); // ठीक: अस्थायी से const रेफरेंस बाइंड होता है func(someInt); // ठीक: lvalue से बाइंड int& ref = 10; // त्रुटि: नॉन-कॉन्स्ट रेफरेंस अस्थायी से बाइंड नहीं हो सकता const int& cref = 10; // ठीक: const रेफरेंस अस्थायी का जीवनकाल बढ़ाता है
निष्कर्ष
int: वैल्यू टाइप, कॉपी सेमेन्टिक्सconst int&: कॉन्स्टेंट इंट का रेफरेंस, कोई कॉपी नहीं, रीड-ओनली एक्सेस- पैरामीटर्स पर
const int&मेंconstरिडंडेंट नहीं है - यह रेफरेंस किए गए ऑब्जेक्ट पर लागू होता है, रेफरेंस पर नहीं - बड़े ऑब्जेक्ट्स के लिए
const T&पसंद करें जिन्हें संशोधित करने की आवश्यकता नहीं है