2012-02-03 21 views
5

लगता है मैं एक समारोह जो स्थिरांक संदर्भ तर्क पारित स्वीकार करने के लिए गैर स्थिरांक तर्क पारितC++ समारोह:, स्थिरांक संदर्भ पैरामीटर

int func(const int &i) 
{ 
    /* */ 
} 

int main() 
{ 
    int j = 1; 
    func(j); // pass non const argument to const reference 
    j=2; // reassign j 
} 

इस कोड को सी ++ प्राइमर को fine.according काम करता है, क्या इस तर्क को यह कार्य करने के लिए पारित करने है इस प्रकार की तरह,

int j=1; 
const int &i = j; 

जिसमें मैं j के एक पर्याय (उपनाम) है,

मेरे सवाल यह है: अगर मैं j के एक पर्याय है, और मैं स्थिरांक के रूप में परिभाषित किया गया है, मैं रों कोड:

const int & i = j

एक गैर स्थिरांक चर redelcare चर const के लिए? सी ++ में यह अभिव्यक्ति कानूनी क्यों है?

उत्तर

12

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

स्थिरांक संदर्भ पैरामीटर के मामले में, इसका मतलब है main वस्तु (क्योंकि यह j इसके लिए इसके नाम का उपयोग करता है) इतने लंबे समय के रूप में यह केवल के लिए अपने नाम का उपयोग करता संशोधित कर सकते हैं कि, func वस्तु संशोधित नहीं कर सकते हैं, जबकि यह, ifunc सिद्धांत में सिद्धांत को संशोधित करके const_cast के साथ एक और संदर्भ या सूचक बनाकर ऑब्जेक्ट को संशोधित कर सकता है, लेकिन नहीं।

+0

आपका मतलब है कि संदर्भ वस्तु ही नहीं है। तो कैसे समझें कि मैं जम्मू का समानार्थी हूं? क्या इसका मतलब है कि मैं और जे एक ही वस्तु हैं, क्योंकि मैं और जे दोनों का एक ही भौतिक पता है? – fuyi

+0

मैं वस्तु जे के लिए एक वैकल्पिक संदर्भ है। तो एक समानार्थी। हालांकि आपने कहा है कि आप जिस वस्तु का जिक्र कर रहे हैं उसे बदलने के लिए 'i' का उपयोग नहीं कर सकते हैं। कुछ भी नहीं कहता है कि आप जिस ऑब्जेक्ट को संदर्भित करते हैं उसे संशोधित करने की किसी अन्य विधि का उपयोग नहीं कर सकते हैं। आप उस घोषणा के साथ मेरी क्षमताओं को सीमित कर रहे हैं, उन्हें विस्तारित करने की कोशिश नहीं कर रहे हैं, और यह ठीक है। –

+1

@xiaopang: ''i'' और '' j'' नाम हैं। वे दोनों एक ही वस्तु का उल्लेख करते हैं। अक्सर हम कहते हैं कि इसका नाम "है", या वह नाम "वस्तु" है। उदाहरण के लिए मैं कह सकता हूं "मैं स्टीव हूं"। लेकिन यह अपरिहार्य शब्दावली है, दोनों एक ही बात नहीं हैं। मैं यह भी कह सकता हूं, "स्टीव 'पूंजी' एस 'से शुरू होता है। इसका मतलब यह नहीं है कि * मैं * पूंजी 'एस' से शुरू होता हूं। 'स्टीव' के चारों ओर उद्धरण यह इंगित करने के लिए हैं कि मैं नाम के बारे में बात कर रहा हूं, न कि जिस वस्तु को संदर्भित करता है। 'i' और' j' समानार्थी हैं क्योंकि वे दोनों एक ही वस्तु के नाम हैं, लेकिन उनके गुणों के नाम अलग हैं। –

3
const int &i = j; 

यह निरंतर पूर्णांक का संदर्भ घोषित करता है। इस संदर्भ का उपयोग करके, आप उस पूर्णांक के मान को बदलने में सक्षम नहीं होंगे जो इसका संदर्भ देता है।

आप अभी भी मूल चर नाम का उपयोग करके मूल्य बदल सकते हैं, बस निरंतर संदर्भ का उपयोग नहीं कर रहे हैं I।

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