2011-09-13 10 views
8

का संदर्भ संदर्भ निम्न में, एक गैर-कॉन्स्ट ऑब्जेक्ट में कॉन्स्ट संदर्भ का उपयोग करने से पहले एक अस्थायी ऑब्जेक्ट बनाया जाएगा?गैर-कॉन्स्ट ऑब्जेक्ट

const int y = 2000; 
const int &s = y // ok, const reference to const object. 

int x = 1000; 
const int &r = x; // any temporary copy here? 

यदि नहीं, तो यह कैसे काम करता है?

const int z = 3000; 
    int &t = z // ok, why can't you do this? 

उत्तर

13

सं

एक संदर्भ बस किसी मौजूदा ऑब्जेक्ट के लिए एक उपनाम है। const संकलक द्वारा लागू किया गया है; यह बस जांचता है कि आप संदर्भ r के माध्यम से ऑब्जेक्ट को संशोधित करने का प्रयास नहीं करते हैं। * इसके लिए एक प्रतिलिपि बनाने की आवश्यकता नहीं है।

यह देखते हुए कि const केवल "केवल पढ़ने के लिए" लागू करने के लिए संकलक के लिए एक निर्देश है, तो यह तुरंत स्पष्ट होना चाहिए कि आपका अंतिम उदाहरण संकलित क्यों नहीं होता है। const व्यर्थ होगा यदि आप एक गैर-constconst ऑब्जेक्ट को refref करके इसे छोटा रूप से बाधित कर सकते हैं।

* बेशक, आप अभी भी x के माध्यम से ऑब्जेक्ट को संशोधित करने के लिए स्वतंत्र हैं। कोई भी परिवर्तन r के माध्यम से भी दिखाई देगा, क्योंकि वे एक ही ऑब्जेक्ट को संदर्भित करते हैं।

+1

विशेष रूप से उल्लेख किया है, 'r' के मूल्य बदल सकते हैं, भले ही यह घोषित किया जाता है की तरह हो गया है 'const'। – avakar

+0

आमतौर पर, कंपाइलर एक साधारण सूचक के साथ संदर्भ लागू करते हैं। –

+1

@quant_dev ओपी के नमूने को देखते हुए, स्रोत कोड जो 'x' और स्रोत कोड का उल्लेख करता है,' आर' का उल्लेख करता है, समान मशीन कोड में संकलित किया जाता है। कोई पॉइंटर्स शामिल नहीं है (मैंने देखा सभी कंपाइलर्स पर)। ऐसा नहीं है कि यह वैसे भी प्रासंगिक है। – Cubbi

5

int x = 1000; 
const int &r = x; 

में दाएँ हाथ की ओर lvalue एक और x के प्रकार के संदर्भ (सीवी-योग्यता की अनदेखी) के प्रकार के रूप में ही है। इन परिस्थितियों में संदर्भ सीधे x से जुड़ा हुआ है, कोई अस्थायी नहीं बनाया गया है।

"यह कैसे काम करता है" के रूप में ... मुझे समझ में नहीं आता कि आपके प्रश्न को किसने प्रेरित किया। यह सिर्फ सबसे कठोर तरीके से काम करता है: संदर्भ सीधे x से जुड़ा हुआ है। इसके लिए और कुछ नहीं।

आप

const int z = 3000; 
int &t = z; 

ऐसा नहीं कर सकते क्योंकि यह तुरंत स्थिरांक-शुद्धता के नियमों का उल्लंघन।

+2

+1 – Lou

1

संदर्भ पर समझ (&) इस सवाल का जवाब ..

संदर्भ बस चर है कि यह यह करने के लिए असाइन किया गया है करने के लिए एक उपनाम ..

और स्थिरांक की कोई समस्या संकलक द्वारा लगाए गए है वेरिएबल के रूप में घोषित किया गया है जिसे

int x = 1000; 
const int &r = x; 

इस मामले में, यह एक गैर कॉन्स्ट चर के संदर्भ का संदर्भ है। तो अगर आप संदर्भ चर आर के साथ एक्स के डेटा को बदल सकते हैं नहीं (सिर्फ एक केवल पढ़ने के लिए कार्य करता है) .. अभी तक आप अभी भी एक्स

const int z = 3000; 
int &t = z 

स्थिरांक सदस्य के लिए, गैर स्थिरांक संदर्भ को संशोधित करने के इस मामले में से बदल सकते हैं डेटा एक्स जो अर्थहीन है आप कह रहे हैं कि संदर्भ आपको एक कॉन्स सदस्य संपादित करने की अनुमति दे सकता है (जो कभी भी संभव नहीं है) ..

तो तुम एक स्थिरांक सदस्य के लिए एक संदर्भ बनाना चाहते हैं, यह पहला मामला आप

const int z = 3000; 
const int &t = z; 
संबंधित मुद्दे