2010-02-07 20 views
9

यदि कोई फ़ंक्शन एक int देता है, तो इसे एक int मान द्वारा असाइन किया जा सकता है? मुझे नहीं लगता कि यह किसी फ़ंक्शन को मान असाइन करने के लिए बहुत अधिक समझ में आता है।यदि कोई फ़ंक्शन एक इंटरेस्ट लौटाता है, तो क्या इसे एक इंट सौंपा जा सकता है?

int f() {} 

f() = 1; 

मैंने देखा कि, यदि फ़ंक्शन किसी int का संदर्भ देता है, तो यह ठीक है। क्या यह केवल int तक सीमित है? अन्य प्रकारों के बारे में कैसे? या कोई अन्य नियम?

int& f() {} 

f() = 1; 
+1

किसी फ़ंक्शन को मान निर्दिष्ट करने का क्या मतलब होगा? इसके बजाय एक चर का उपयोग क्यों नहीं करते? –

उत्तर

22

पहला फ़ंक्शन एक पूर्णांक-मान-मान देता है, जो आर-मान है। आप सामान्य रूप से आर-वैल्यू को असाइन नहीं कर सकते हैं। दूसरा एफ() एक पूर्णांक का संदर्भ देता है, जो एक एल-वैल्यू है - ताकि आप इसे असाइन कर सकें।

int a = 4, b = 5; 

int& f() {return a;} 

... 
f() = 6; 
// a is 6 now 

नोट: यदि आप कार्य करने के लिए एक मूल्य निर्दिष्ट नहीं है, तो आप सिर्फ अपने रिटर्न मान पर निर्दिष्ट करते हैं। निम्नलिखित के प्रति सावधान रहें :

int& f() { int a = 4; return a; } 

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

+0

क्या आप समझा सकते हैं कि मूल्य-दर-मूल्य एक आर-वैल्यू क्यों है? – skydoor

+0

किसी फ़ंक्शन का वापसी मान उचित C++ चर नहीं है, जैसे 'int i;'। यह सिर्फ एक अस्थायी मूल्य है। यह एक स्मृति स्थान का प्रतिनिधित्व नहीं करता है। –

+1

@skydoor, इसे सारांशित किया जा सकता है * "आप केवल ऑब्जेक्ट्स को असाइन कर सकते हैं" *। आपके कॉल में, फ़ंक्शन एक मान देता है जो किसी ऑब्जेक्ट से मेल नहीं खाता है: पूर्णांक * केवल * एक अमूर्त मान का प्रतिनिधित्व करता है।उदाहरण के लिए, यदि आपने 'std :: string' वापस कर दिया था, तो मान लौटाया गया मूल्य (जो वास्तव में एक आर-मान है) एक स्ट्रिंग ऑब्जेक्ट के अनुरूप होगा, और आप * इसे * असाइन कर सकते हैं। एक 'int' 'वापसी मूल्य के लिए भी यही सच है। उस स्थिति में, "मान" लौटाया गया (जो एक एल-वैल्यू है) एक int * ऑब्जेक्ट * से मेल खाता है, और आप इसे असाइन कर सकते हैं। एक वस्तु आवश्यक है, क्योंकि एक असाइनमेंट एक संग्रहीत स्थिति को संशोधित करता है। –

1

यह केवल int की सीमा नहीं है, लेकिन आदिम प्रकारों के लिए ऐसा करने में कोई बात नहीं है। यह उपयोगी होता है जब आपके कक्षाएं

+1

क्या आप कह रहे हैं कि एक आदिम प्रकार के संदर्भ को वापस करने में कोई बात नहीं है? तो 'वेक्टर ' के ऑपरेटर [] 'जैसी चीजें व्यर्थ हैं? – sepp2k

+1

ऐसा करने में बहुत कुछ बिंदु है (यदि 'इसका मतलब है' आप एक संदर्भ लौटने का मतलब रखते हैं) - यदि आपके पास std :: vector है तो वेक्टर जो चीजों को वेक्टर रिटर्न में संदर्भित करते हैं। –

+0

उनके उदाहरण के संदर्भ में – anthares

0

एक समारोह मूल्य द्वारा एक वस्तु देता है, तो द्वारा, तो काम के लिए संभव है, भले ही समारोह कॉल है एक रावल्यू उदाहरण के लिए:

std::string("hello") = "world"; 

यह एक अस्थायी स्ट्रिंग ऑब्जेक्ट बनाता है, इसे बदलता है, और फिर तुरंत इसे नष्ट कर देता है। एक और अधिक व्यावहारिक उदाहरण है:

some_function(++list.begin()); 

आप list.begin() + 1 नहीं लिख सकता है क्योंकि इसके अलावा सूची iterators पर संभव नहीं है, लेकिन वेतन वृद्धि ठीक है। इस उदाहरण में असाइनमेंट शामिल नहीं है, लेकिन असाइनमेंट अधिक सामान्य नियम का एक विशेष मामला है "सदस्य कार्यों को राजस्व पर बुलाया जा सकता है"।

+0

यह एक आम मामला है? क्या आप मुझे एक उदाहरण दे सकते हैं? – skydoor

+1

जबकि मैं समझता हूं कि यह सिर्फ एक उदाहरण है, ध्यान दें कि '++ list.begin() 'को काम करने की आवश्यकता नहीं है। ऑपरेटर को एक मुक्त फ़ंक्शन के रूप में कार्यान्वित किया जा सकता है जो एक गैर-कॉन्स्ट संदर्भ को स्वीकार करता है और इसे पुनरावर्तक को अस्थायी रूप से बाध्य करने में विफल रहता है। –

+1

धन्यवाद, मैं कभी याद नहीं कर सकता कि कौन से ऑपरेटरों को सदस्य कार्य करना है और जो निःशुल्क कार्य हो सकते हैं। – fredoverflow

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

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