2011-08-24 12 views
20

मेरे पास C++ में संदर्भों के उपयोग से संबंधित कुछ प्रश्न हैं।मैं किसी संदर्भ के लिए एक नया मान क्यों निर्दिष्ट कर सकता हूं, और मैं किसी संदर्भ को संदर्भित कैसे कर सकता हूं?

  1. कोड में नीचे दिखाया गया है, यह कैसे काम करता है और लाइन q = "world"; में एक त्रुटि नहीं दे सकता है?

    #include <iostream> 
    
    using namespace std; 
    
    int main() 
    { 
        char *p = "Hello"; 
        char* &q = p; 
        cout <<p <<' '<<q <<"\n"; 
        q = "World"; //Why is there no error on this line 
        cout <<p <<' '<<q <<"\n"; 
    } 
    
    1. कैसे एक संदर्भ क्ष कुछ और करने के लिए इसे पुनः शुरू किया जा सकता है?

    2. स्ट्रिंग शाब्दिक, p = "Hello", निरंतर या केवल पढ़ने योग्य स्थान नहीं है? तो अगर हम करते हैं,

      q = "World"; 
      

      p में स्ट्रिंग जो निरंतर माना जाता है बदला जा नहीं होगा?

  2. मैं, के बारे में सी ++ संदर्भ प्रकार चर पढ़ा है के रूप में वे इसे पुनः शुरू नहीं किया जा सकता या पुन: असाइन बाद से वे लगातार संकेत के रूप में जमा हो जाती है 'आंतरिक'। तो एक कंपाइलर एक त्रुटि देगा।

    लेकिन वास्तव में एक संदर्भ चर को फिर से सौंप दिया जा सकता है?

    int i; 
    
    int &j = i; 
    
    int k; 
    
    j = k; //This should be fine, but how we reassign to something else to make compiler flag an error? 
    

    मैं इस संदर्भ को पकड़ने की कोशिश कर रहा हूं, और इसमें शायद कुछ महत्वपूर्ण चीजें संबंधित हैं, इसलिए ये प्रश्न।

तो इसे साफ़ करने के लिए कोई भी पॉइंटर्स उपयोगी होगा।

उत्तर

41
    • एक
    • ) यह नहीं, लाइन आप बोली संदर्भ q परिवर्तन नहीं करता है, यह परिवर्तन कर सकते हैं p करने के लिए i का मूल्य बदल जाता है।
    • बी) कोई शाब्दिक स्थिर नहीं है, लेकिन p एक सूचक है जो एक शाब्दिक बिंदु पर इंगित करता है। पॉइंटर बदला जा सकता है, क्या नहीं किया जा सकता है। q = "world"; पॉइंटर p कुछ और इंगित करता है।
  1. आप को लगता है कि इस कोड

    int i; 
    int &j = i; 
    int k; 
    j = k; 
    

    एक संदर्भ फिर नियत है लगते हैं, लेकिन ऐसा नहीं है। यह k से i, j का मान निर्दिष्ट कर रहा है अभी भी i को संदर्भित करता है। मुझे लगता है कि यह आपकी बड़ी गलतफहमी है।

+0

निश्चित रूप से, मेरा क्यूएनएस था और यह कोड किसी अन्य चीज़ के संदर्भ को फिर से सौंपेगा। (जिसे तकनीकी रूप से अनुमति नहीं है) मैंने ओपी में उल्लेख किया है कि j = k; ठीक है क्योंकि मुझे पता था कि यह 'रेफरी' के मूल्य को बदलता है। – goldenmean

+7

कोई कानूनी कोड नहीं है जो एक संदर्भ को फिर से सौंपेगा। – john

19

उन संदर्भों के बारे में एक महत्वपूर्ण जानकारी जो मुझे लगता है कि आप गायब हैं, यह है कि एक बार जब संदर्भ किसी ऑब्जेक्ट से बंधे होते हैं, तो आप इसे कभी भी पुन: असाइन नहीं कर सकते। उस बिंदु से आगे, जब भी आप संदर्भ का उपयोग करते हैं, तो यह उस वस्तु का उपयोग करने से अलग नहीं है जिसे संदर्भित किया जाता है। उदाहरण के लिए, कोड के अपने पहले टुकड़ा में, जब आप लिखना

q = "World"; 

q के बाद से एक संदर्भ p करने के लिए बाध्य है, इस

p = "World"; 

कौन सा बस बदलता है जहां p इशारा कर रही है लेखन के बराबर है, जिस स्ट्रिंग पर इशारा कर रहा है उसकी सामग्री नहीं। (यह भी बताता है कि यह क्रैश क्यों नहीं होता है!)

आपके दूसरे प्रश्न के लिए, किसी ऑब्जेक्ट को बाध्य करने के बाद संदर्भों को फिर से असाइन नहीं किया जा सकता है। यदि आपको एक संदर्भ होना चाहिए जो इसके संदर्भ को बदल सकता है, तो आपको इसके बजाय एक पॉइंटर का उपयोग करना चाहिए।

आशा है कि इससे मदद मिलती है!

3

ए) किसी संदर्भ क्यू को किसी और चीज़ के लिए पुन: प्रारंभ कैसे किया जा सकता है?

यह नहीं हो सकता!

एक संदर्भ चर एक उपनाम बना रहता है जिस पर इसे सृजन के समय शुरू किया गया था।


ख) स्ट्रिंग शाब्दिक, पी = "नमस्ते", एक निरंतर/में केवल पढ़ने के लिए स्थान नहीं है। तो अगर हम करते हैं,
नहीं, ऐसा नहीं है।

char* &q = p; 

यहाँ q प्रकार चार p के सूचक के लिए एक संदर्भ है। यहां स्ट्रिंग स्थिर है जो पॉइंटर नहीं है, इसे किसी अन्य स्ट्रिंग पर इंगित किया जा सकता है, और संदर्भ इस पॉइंटर के लिए उपनाम है जो स्ट्रिंग अक्षर नहीं है, इसलिए यह मान्य है।


ग) दूसरा सवाल मेरे पास है मैं, के बारे में सी ++ संदर्भ प्रकार चर वे इसे पुनः शुरू नहीं कर सकते हैं के रूप में किया जा/पुन: असाइन पढ़ा है, क्योंकि वे लगातार संकेत के रूप में जमा हो जाती है 'आंतरिक' है। तो एक कंपाइलर एक त्रुटि देगा।

int i; 

int &j = i; 

int k; 

j = k; //This should be fine, but how we reassign to something else to make compiler flag an error 

संदर्भ को पुन: असाइन नहीं करता है। यह चर के मान को बदलता है जिस पर यह उपनाम था।

इस मामले में यह k

3

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

int p; // Declares p as an integer; Defines p & allocates space 
int &q = p ; // Declares a Reference. Though they are symbolically 2 variables, 
      // they essentially refer to same name and same memory location. 

तो, पी = 5 और क्यू = 5 सभी समान होंगे।

अपने उदाहरण में,

char *p = "Hello"; // Declares your pointer to "Hello". p has its own existence. 
char* &q = p; // This now creates a reference (alias) to p with name q. 

तो सब सब में, पी & क्ष इकाई/वस्तु (स्मृति) के नाम हैं।

तो, यदि आप कुछ क्यू असाइन करते हैं, तो यह पी में भी प्रतिबिंबित होता है। Coz यह पी के लिए असाइनमेंट के समान है। तो क्यू = "वर्ल्ड", जिसका अर्थ है पी भी अब "विश्व" को इंगित करता है। अर्थात।मेमोरी लोकेशन जो पी & क्यू दोनों संदर्भित करता है - "विश्व" के पहले अक्षर का पता रखता है।

मुझे आशा है कि यदि आप उपनाम के रूप में संदर्भ की धारणा को समझते हैं तो दूसरे प्रश्न का उत्तर नहीं दिया जाना चाहिए।

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

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