2010-03-04 8 views
28

इस तरह एक सी ++ समारोह में:सी ++ में, फ़ंक्शन के रिटर्न प्रकार के बाद क्या और क्या मतलब है?

int& getNumber(); 

क्या & मतलब है?

int getNumber(); 
+4

है 'और' मूल रूप से कहा गया है कि मैं ** पता लौटने कर रहा हूँ ** जहां लौटाया गया मूल्य संग्रहीत किया जाता है (यानी यह पूर्णांक का 'संदर्भ' देता है) जबकि 'int getNumber() 'फ़ंक्शन द्वारा लौटाए गए पूर्णांक का' मान 'देता है। एक बात यह है कि यदि संदर्भ पूर्णांक एक नल को इंगित करता है, तो आपके पास सेगमेंटेशन गलती हो सकती है जबकि अन्य फ़ंक्शन 0 देता है; –

+6

एक चीज जिसने किसी का भी उल्लेख नहीं किया है: कभी भी स्थानीय चर के संदर्भ को वापस न करें! फ़ंक्शन के अंत में चर के दायरे से बाहर होने पर आपको अपरिभाषित परिणाम मिलेंगे। –

+4

एक तरफ के रूप में, यदि 'getNumber()' उस वर्ग का सार्वजनिक तरीका है जो उस वर्ग का निजी सदस्य चर लौटाता है, तो उस संदर्भ का उपयोग न करें जो संदर्भ देता है। अन्यथा, आपकी कक्षा के उपयोगकर्ता कक्षा के बाहर उस निजी सदस्य के मूल्य को बदलने में सक्षम होंगे। दूसरे शब्दों में, निजी सदस्य अब वर्ग द्वारा encapsulated नहीं है। –

उत्तर

24

हाँ, int& संस्करण एक int के लिए एक संदर्भ रिटर्न: यह से अलग है। int संस्करण मूल्य द्वारा int देता है।

सी ++ पूछे जाने वाले प्रश्न

+1

डाउनवॉटर की व्याख्या करने की देखभाल? –

+23

ओपी को एक बड़े दस्तावेज़ के माध्यम से पढ़ने के बजाय, जो उसके प्रश्न का उत्तर देता है, लेकिन केवल एक चौराहे के रास्ते में, एक 10 लाइन प्रोग्राम क्यों नहीं लिखता जो अंतर को प्रदर्शित करता है। एक उचित उदाहरण के लिए –

2

"&" में the section on references देखें संदर्भ, इस मामले में "एक पूर्णांक के संदर्भ में" का अर्थ है।

7

हां, यह अलग है।

& का अर्थ है कि आप एक संदर्भ वापस कर सकते हैं। अन्यथा यह एक प्रतिलिपि वापस करेगा (ठीक है, कभी-कभी संकलक इसे अनुकूलित करता है, लेकिन यह समस्या यहां नहीं है)।

एक उदाहरण वेक्टर है। ऑपरेटर [] & देता है। यह हमें करने की अनुमति देता है:

my_vector[2] = 42; 

यह एक प्रतिलिपि के साथ काम नहीं करेगा।

+1

+1 जो वैश्विक चर का उपयोग नहीं करता है! @ जोहान, यह काम नहीं करेगा क्योंकि आप या तो एक स्टैक स्थान या वेक्टर में स्थान की एक प्रति को असाइन करेंगे ... दुर्भाग्य से विकिपीडिया यहां गलत है। –

2

इसका मतलब है कि यह एक संदर्भ प्रकार है। एक संदर्भ क्या है?

विकिपीडिया:

सी ++ प्रोग्रामिंग भाषा में, एक संदर्भ के लिए एक सरल संदर्भ डेटाप्रकार कि कम शक्तिशाली लेकिन सी से विरासत में मिली सूचक प्रकार अधिक सुरक्षित नाम सी ++ संदर्भ भ्रम की स्थिति पैदा हो सकती है, कंप्यूटर में के रूप में है विज्ञान एक संदर्भ एक सामान्य अवधारणा डेटाटाइप है, पॉइंटर्स और सी ++ संदर्भ विशिष्ट संदर्भ डेटाटाइप कार्यान्वयन के साथ। प्रपत्र की घोषणा:

प्रकार & नाम

जहां एक प्रकार है और एक पहचानकर्ता है जिसका प्रकार संदर्भ करना है।

उदाहरण:

  1. पूर्णांक एक = 5;
  2. int & आरए = ए;
  3. बाहरी int & आरबी;
  4. int & foo();
  5. शून्य बार (int & आरपी);
  6. कक्षा MyClass {int & m_b;/* ...* /};
  7. int funcX() {वापसी 42; }; int (& xFunc)() = funcX;

यहाँ, आरए और rB "संदर्भ int करने के लिए", foo() एक समारोह है कि एक संदर्भ रिटर्न int करने के लिए है, बार() एक संदर्भ पैरामीटर के साथ एक समारोह है, है जो प्रकार के होते हैं int के संदर्भ में, MyClass एक सदस्य के साथ एक वर्ग है जो int के संदर्भ में है, funcX() एक फ़ंक्शन है जो एक int देता है, xFunc() funcX के लिए उपनाम है। विवरण के

बाकी here

+1

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

+2

लेकिन यह कई संकलक त्रुटियों से बच सकता है। विकिपीडिया का यही अर्थ है। – Shayan

+1

मैंने कभी भी एक संकलक त्रुटि के बारे में नहीं सुना है जो पॉइंटर्स और संदर्भों के लिए मूल रूप से अलग था। –

1

इसका मतलब यह है कि यह एक पूर्णांक, नहीं किसी पूर्णांक ही करने के लिए एक reference लौट रहा है।

1

यह एक संदर्भ है, जो एक पॉइंटर की तरह है, सिवाय इसके कि आपको पॉइंटर-डीरेंसेंस ऑपरेटर (* या ->) का उपयोग करने की आवश्यकता नहीं है, पॉइंटर डीरफ़्रेंसिंग का निहित है।

विशेष रूप से ध्यान दें कि सभी आजीवन चिंताओं (जैसे पते द्वारा एक स्टैक वैरिएबल वापस न करें) को अभी भी एक सूचक का उपयोग करने के लिए संबोधित करने की आवश्यकता है।

+1

संदर्भों को पॉइंटर्स से तुलना की जा सकती है, और पॉइंटर्स के रूप में सोचा जा सकता है लेकिन निश्चित रूप से "बिल्कुल पॉइंटर्स की तरह नहीं" हैं। उदाहरण के लिए, किसी संदर्भ को असाइन करने से संदर्भ * के संदर्भ में * * को संदर्भित किया जाता है। इसके अलावा, संदर्भों को उनके निर्माण के समय एक मूल्य आवंटित किया जाना चाहिए, और अपने पूरे जीवनकाल में उसी मूल्य का जिक्र करना जारी रखें। – Thomas

+1

@ थॉमस: संदर्भों को सृजन पर एक मूल्य असाइन नहीं किया गया है, वे एक पते से जुड़े हैं - एक सूचक। हां, उन्हें एक नए पते के साथ पुन: संयोजित नहीं किया जा सकता है, लेकिन न ही एक कॉन्स्ट पॉइंटर हो सकता है। एक संदर्भ के माध्यम से असाइनमेंट बिल्कुल एक सूचक के माध्यम से असाइनमेंट जैसा ही है, सिवाय इसके कि आपको पॉइंटर सिंटैक्स के लिए अतिरिक्त तारांकन की आवश्यकता है, यही मेरा मतलब है "पॉइंटर डीरफ्रेंसिंग का अर्थ है"। एक संदर्भ नहीं है और थोड़ा सिंटैक्टिक चीनी के साथ मिश्रित एक कॉन्स पॉइंटर से कम नहीं है। –

4

int& getNumber(): फ़ंक्शन संदर्भ द्वारा एक पूर्णांक देता है।

int getNumber(): फ़ंक्शन मान द्वारा एक पूर्णांक देता है।

वे कुछ तरीकों से भिन्न होते हैं और दिलचस्प अंतरों में से एक यह है कि पहला प्रकार असाइनमेंट के बाईं ओर उपयोग किया जा सकता है जो दूसरे प्रकार के साथ संभव नहीं है।

उदाहरण:

int global = 1; 

int& getNumber() { 
     return global; // return global by reference. 
} 

int main() { 

     cout<<"before "<<global<<endl; 
     getNumber() = 2; // assign 2 to the return value which is reference. 
     cout<<"after "<<global<<endl; 

     return 0; 
} 

Ouptput:

before 1 
after 2 
4

पहले संस्करण आप , जो शायद नहीं है कि आप क्या चाहते लिखने के लिए अनुमति देता है। अपने स्वयं के कंटेनर प्रकारों के लिए operator[] ओवरलोडिंग करते समय रिटर्निंग संदर्भ बहुत उपयोगी होते हैं। यह आपको container[9] = 42 लिखने में सक्षम बनाता है।

+1

बताएं कि यह कंटेनरों के लिए क्यों काम करता है और आपके पास एक सही उत्तर है। –

25

यह अलग है।

int g_test = 0; 

int& getNumberReference() 
{ 
    return g_test; 
} 

int getNumberValue() 
{ 
    return g_test; 
} 

int main() 
{ 
    int& n = getNumberReference(); 
    int m = getNumberValue(); 
    n = 10; 
    cout << g_test << endl; // prints 10 
    g_test = 0; 
    m = 10; 
    cout << g_test << endl; // prints 0 
    return 0; 
} 

getNumberReference() एक संदर्भ देता है, हुड यह एक सूचक है कि एक पूर्णांक चर को इंगित करता है की तरह है के तहत। संदर्भ में लागू कोई भी परिवर्तन लौटा चर पर लागू होता है।

getNumberReference(), भी एक बाएं मूल्य है इसलिए इसे इस तरह इस्तेमाल किया जा सकता:

getNumberReference() = 10; 
5

अंतर यह है कि & बिना क्या आप वापस पाने के लिए वापस आ पूर्णांक की एक प्रति, उपयुक्त है अन्य दिनचर्या में गुजरने के लिए, सामान की तुलना करना, या अपने स्वयं के चर में कॉपी करना।

& के साथ, आप जो भी वापस प्राप्त करते हैं वह आवश्यक है परिवर्तनीय लौटा हुआ पूर्णांक होता है।इसका मतलब है कि आप वास्तव में, एक काम के बाएं हाथ की ओर पर डाल दिया ताकि तरह कर सकते हैं:

getNumber() = 200; 
संबंधित मुद्दे