2013-08-05 11 views
5

C++ में एक संदर्भ वापस जाने के लिए हम एक समारोह से एक संदर्भ वापस लौटाना होगा क्या परिदृश्यों कर के तहत है? मैं फंक्शन इनपुट के रूप में संदर्भों का उपयोग करके समझता हूं, लेकिन फ़ंक्शन आउटपुट के लिए, हम केवल मूल्य या पॉइंटर्स क्यों नहीं लौट सकते हैं?जब एक समारोह, C++

+0

एक सूचक एक संदर्भ नहीं है

class Array { public: int& operator[] (const int& index); ... }; 

निम्नलिखित वाक्य रचना की अनुमति दे? –

+0

@ सैमियम: अगर वे एक ही बात थे और एक ही अर्थ थे, तो आपको क्यों लगता होगा कि वे पहली जगह में भाषा में भी पेश किए गए थे? – ereOn

+1

इस बारे में सोचें कि आप एक संदर्भ वापस किए बिना, 'वेक्टर' के सबस्क्रिप्ट ऑपरेटर को कैसे कार्यान्वित करेंगे। – jrok

उत्तर

8

संदर्भ कार्यों के मूल्यों वापस जाने के लिए काम उपलब्ध कराने के लिए किया जाता है। अजीब लगता है, लेकिन एक उदाहरण के रूप में सी ++ सरणी असाइनमेंट ऑपरेटर, एक समारोह है कि वास्तव में सूचकांक पैरामीटर पर तत्व के लिए संदर्भ देता है इतना है कि यह को सौंपा जा सकता है जैसे

Array a; 
a[4] = 192; 

सदा सहायक सी ++ पूछे जाने वाले प्रश्न से प्रेरित होकर:

https://isocpp.org/wiki/faq/references#returning-refs

+3

+1 धन्यवाद। यह एक दृढ़ उदाहरण है। – SteveLove

+0

के संदर्भ के लिए – ahala

+0

@ahala क्या आप उत्तर के रूप में चिह्नित कर सकते हैं अगर आपको लगता है कि मैंने आपके प्रश्न का पूरी तरह उत्तर दिया है? – jrs

1

आप एक संदर्भ लौटा सकते हैं या वस्तु को पहले से ही समारोह में कहा जाता है से पहले से मौजूद है। तो यह कोई समस्या नहीं है।

इस पोस्ट में यह अच्छी तरह से summmarizes। Is the practice of returning a C++ reference variable, evil?

+1

पोस्ट लिंक दूसरी ओर सवाल पर चर्चा करता है, न कि जब हमें संदर्भ वापस करना होगा या संदर्भ लौटने पर पॉइंटर्स लौटने से बेहतर होगा। – ahala

0

किसी फ़ंक्शन से संदर्भ लौटने पर एक सूचक लौटने के समान फायदे और नुकसान होते हैं।

एक गैर स्थिरांक संदर्भ रिटर्निंग या सूचक फोन करने वाले सदस्य चर को लिखने और गैर स्थिरांक सदस्य कार्यों कॉल करने के लिए अनुमति देता है।

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

के विषय पर एक संदर्भ वापस करना चाहिए, यह ऑपरेटर के साथ सिंटैक्टिक चीनी के लिए उपयोगी है, जो लौटने वाले पॉइंटर्स को कॉलर को पॉइंटर को कम करने की आवश्यकता होगी।

+2

जब कोई कोई नलप्टर लौटाता है;) –

+3

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

4

मुझे यकीन नहीं है कि ऐसे स्थान हैं जहां आप एक संदर्भ वापस कर सकते हैं।

ओवरलोडिंग मन में operator++() स्प्रिंग्स, लेकिन यह अभी भी एक संदर्भ वापस जाने के लिए अनिवार्य नहीं है। सामान्य नियम लागू होते हैं, हालांकि: यदि आप किसी पॉइंटर को किसी चीज़ पर वापस कर सकते हैं, तो आप ज्यादातर मामलों में सुरक्षित रूप से संदर्भ वापस कर सकते हैं। एक चर है कि कार्य करने के लिए स्थानीय है जैसे - मुख्य बात कुछ है कि क्षेत्र से बाहर चला जाता है के लिए एक संदर्भ वापस जाने के लिए नहीं है। *this का संदर्भ लौटाना काफी आम है।

एक मूल्य लौटने में सक्षम होने के लिए एक मूल्यवान चीज है, क्योंकि यह या तो (ए) लौटाई गई चीज़ की एक प्रति बनाता है, या (बी) मूव सेमेन्टिक्स (सी ++ 11) और/या अधिकतम उपयोग करता है रिटर्न वैल्यू ऑप्टिमाइज़ेशन (RVO on wikipedia)।

आप की जरूरत नहीं है या एक प्रति चाहते हैं, तो मूल्य प्रकार के लिए संदर्भ से लौटने आप क्या चाहते हैं, जब से तुम सूचक की तरह उपयोग, यानी * या के साथ लौटे बात भिन्नता के लिए होने की संभावना नहीं चाहते हैं आमतौर पर है ->

0

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

Val(X,10) = 1; 

जहां Val एक समारोह जो रिटर्न (माना) इस प्रकार यह 1 के लिए सेटिंग एक सूची में 10 वें स्थान तत्व के लिए संदर्भ है।

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