2011-09-14 21 views
42

एक सुंदर सैद्धांतिक प्रश्न ... निरंतर संदर्भ निरंतर पॉइंटर्स के समान व्यवहार क्यों नहीं करते हैं और मैं वास्तव में उस वस्तु को बदल सकता हूं जो वे इंगित कर रहे हैं? वे वास्तव में एक और सादे परिवर्तनीय घोषणा की तरह लगते हैं। मैं कभी उनका उपयोग क्यों करूंगा? यह एक छोटा उदाहरण है कि मैं जो संकलित करता है तथा कोई त्रुटि के साथ चलता है चलाने है:निरंतर संदर्भ क्या है? (निरंतर संदर्भ नहीं)

int main(){ 
    int i=0; 
    int y=1;  
    int&const icr=i; 
    icr=y;   // Can change the object it is pointing to so it's not like a const pointer... 
    icr=99;   // Can assign another value but the value is not assigned to y... 
    int x=9; 
    icr=x; 
    cout<<"icr: "<<icr<<", y:"<<y<<endl; 
} 
+4

देखो;'। –

+3

एक निरंतर संदर्भ है ... बकवास। :) – jalf

+2

क्या यह संकलन भी करता है? –

उत्तर

53

स्पष्ट उत्तर। `पहले और बाद में` आईसीआर = y मैं `घ पर Does “X& const x” make any sense?

No, it is nonsense

To find out what the above declaration means, read it right-to-left: “x is a const reference to a X”. But that is redundant — references are always const, in the sense that you can never reseat a reference to make it refer to a different object. Never. With or without the const.

In other words, “X& const x” is functionally equivalent to “X& x”. Since you’re gaining nothing by adding the const after the &, you shouldn’t add it: it will confuse people — the const will make some people think that the X is const, as if you had said “const X& x”.

43

बयान icr=y; संदर्भ y का उल्लेख नहीं पड़ता है; यह y के मान को वैरिएबल पर निर्दिष्ट करता है जो icr को संदर्भित करता है, i

संदर्भ स्वाभाविक रूप से const हैं, जो आप उन्हें संदर्भित नहीं कर सकते हैं। 'const संदर्भ' हैं जो वास्तव में 'const' के संदर्भ हैं, यानी आप उस ऑब्जेक्ट के मान को नहीं बदल सकते हैं जिसका वे उल्लेख करते हैं। int& const के बजाए उन्हें const int& या int const& घोषित किया गया है।

+0

तो एक कॉन्स के संदर्भ को भी एक स्थिरांक के निरंतर संदर्भ के रूप में देखा जा सकता है? इससे अब बहुत समझदारी आती है। – Dasaru

+1

@ दासरू: हां, यह हो सकता है, लेकिन गैर-कॉन्स के संदर्भ को गैर-कॉन्स के निरंतर संदर्भ के रूप में भी देखा जा सकता है, क्योंकि संदर्भ स्वयं हमेशा स्थिर होता है, स्वतंत्र रूप से यदि यह किसी कॉन्स्टेंस का संदर्भ देता है या नहीं। – Kaiserludi

23

क्या एक निरंतर संदर्भ (नहीं एक निरंतर के लिए एक संदर्भ)
एक लगातार संदर्भ है वास्तव में एक लगातार करने के लिए एक संदर्भ है।

एक निरंतर संदर्भ/संदर्भ एक निरंतर करने से दर्शाया जाता है:

int const &i = j; //or Alternatively 
const int &i = j; 
i = 1;   //Compilation Error 

यह मूल रूप से इसका मतलब है, आप प्रकार वस्तु जो करने के लिए संदर्भ संदर्भित करता है के मूल्य को संशोधित नहीं कर सकते।
उदाहरण के लिए: त्रुटि में
मूल्य को संशोधित करने की कोशिश कर रहा (असाइन 1) अलग-अलग j स्थिरांक संदर्भ के माध्यम से की, i परिणाम होगा:

assignment of read-only reference ‘i’


icr=y;   // Can change the object it is pointing to so it's not like a const pointer... 
icr=99; 

संदर्भ नहीं बदलता है, यह निर्दिष्ट करता है जिस प्रकार संदर्भ संदर्भित करता है। किसी भी अन्य चर को संदर्भित करने के लिए संदर्भित किए गए संदर्भों के संदर्भ में संदर्भ नहीं दिए जा सकते हैं।

पहले बयान प्रदान करती है मूल्य yi
दूसरा बयान प्रदान करती है मूल्य 99 को i

+0

कैसे और क्यों कथन int & a=3; मान्य है? – Destructor

+3

रुको, 'कॉन्स टाइप' '' टाइप कॉन्स्ट एंड 'के बराबर है? – Tyler

+0

@ टाइलर, हाँ, यह –

3

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

+0

है नमूना कोड वास्तव में निरंतर संदर्भ ('int & const icr = i;') को संदर्भित करता है जो निरंतर संदर्भ नहीं है। – Void

+0

मुझे लगता है कि पोस्टर को कोड में रखा गया था, जहां पोस्टर स्पष्ट नहीं था। – Poodlehat

संबंधित मुद्दे