2013-03-08 10 views
14

मैं बस सी ++ शुरू कर रहा हूं। मैं रिटर्न प्रकार के असाइनमेंट और डेरफरेंस ऑपरेटर के बारे में थोड़ा उलझन में हूं। मैं सी ++ प्राइमर पुस्तक का अनुसरण कर रहा हूं। विभिन्न अवसरों पर, लेखक कहते हैं कि रिटर्न प्रकार का असाइनमेंट ऑपरेटर बाएं हाथ के ऑपरेशन के प्रकार के संदर्भ में है, लेकिन बाद में, वह कहता है कि रिटर्न टाइप बाएं हाथ के ऑपरेंड का प्रकार है। मैंने सी ++ 11 मानक सेक का उल्लेख किया है। 5.17, जहां रिटर्न टाइप को "बाएं हाथ ऑपरेंड का जिक्र करते हुए" लाल्व्यू के रूप में वर्णित किया गया है।असाइनमेंट ऑपरेटर का रिटर्न प्रकार क्या है?

इसी तरह, मैं यह नहीं समझ सकता कि क्या डिफरेंस ऑब्जेक्ट के संदर्भ में ऑब्जेक्ट को संदर्भित करता है या नहीं।

क्या ये कथन समकक्ष हैं? यदि हां, तो कैसे? किसी भी स्पष्टीकरण की सराहना की जाएगी।

+1

कृपया सभी को ध्यान दें। सभी उत्तरों के लिए धन्यवाद लेकिन ऑपरेटर अधिभार के बारे में पूछने का मतलब नहीं था। मैं अभी तक नहीं हूं, मैं सिर्फ भाषा में निर्मित असाइनमेंट ऑपरेशन के बारे में पूछ रहा था। – rahul1210

उत्तर

18

मानक मानक असाइनमेंट ऑपरेटर के रिटर्न प्रकार को सही ढंग से परिभाषित करता है। दरअसल, असाइनमेंट ऑपरेशन खुद ही वापसी मूल्य पर निर्भर नहीं करता है - यही कारण है कि वापसी का प्रकार समझने के लिए सीधा नहीं है।

रिटर्न प्रकार चेनिंग संचालन के लिए महत्वपूर्ण है। निम्नलिखित निर्माण पर विचार करें: a = b = c;। यह a = (b = c) के बराबर होना चाहिए, यानी cb और ba में असाइन किया जाना चाहिए। इसे a.operator=(b.operator=(c)) के रूप में लिखें। सही तरीके से काम करने के लिए a में असाइनमेंट के लिए b.operator=(c) का रिटर्न प्रकार आंतरिक असाइनमेंट परिणाम का संदर्भ होना चाहिए (यह प्रतिलिपि के साथ भी काम करेगा लेकिन यह केवल एक अनावश्यक ओवरहेड है)।

डीरेंसेंस ऑपरेटर रिटर्न प्रकार आपके आंतरिक तर्क पर निर्भर करता है, इसे अपनी आवश्यकताओं के अनुरूप तरीके से परिभाषित करता है।

+1

"मानक सही ढंग से असाइनमेंट ऑपरेटर के रिटर्न प्रकार को परिभाषित करता है" - कैसे? –

+7

@ ओच के रूप में लचियनग्रिगोर ने उद्धृत किया है: * सी ++ 11 मानक सेक। 5।17, जहां रिटर्न टाइप को "बाएं हाथ ऑपरेंड का जिक्र करते हुए लालू" के रूप में वर्णित किया गया है। * – SomeWittyUsername

+7

यह अंतिम टिप्पणी पूरे उत्तर से पहले से ही अधिक उपयोगी है। –

5

वे दोनों कुछ भी हो सकता है, लेकिन आम तौर पर operator = रिटर्न संदर्भ द्वारा वर्तमान वस्तु, यानी

A& A::operator = (...) 
{ 
    return *this; 
} 

और हाँ, और "lvalue" बाएं हाथ संकार्य के प्रकार के संदर्भ में "बाएं हाथ की चर्चा करते हुए ऑपरेंड "एक ही बात का मतलब है।

डीरेंसेंस ऑपरेटर मूल रूप से कोई वापसी प्रकार हो सकता है। यह ज्यादातर प्रोग्राम के तर्क पर निर्भर करता है, क्योंकि आप किसी ऑब्जेक्ट पर लागू होने वाले ऑपरेटर को ओवरलोड कर रहे हैं, ऑब्जेक्ट पर पॉइंटर नहीं। आमतौर पर, यह स्मार्ट संकेत दिए गए, या iterators के लिए प्रयोग किया जाता है, और वस्तु लौट वे चारों ओर लपेट:

+0

क्या आप "बाएं हाथ के संचालन के संदर्भ में" शब्द का विस्तार कर सकते हैं जिसका अर्थ है "बाएं हाथ के संचालन के प्रकार के संदर्भ"। एक लालसा संदर्भ है? – rahul1210

+0

@ user2148032 हाँ, एक संदर्भ एक लवली है। बायां हाथ ऑपरेंड ऑब्जेक्ट ही है (क्योंकि 'x = y' में बाएं हाथ का ऑपरेशन' x' है)। –

+0

धन्यवाद मुझे लगता है कि मुझे यह मिला है – rahul1210

1

मैं इसी तरह के मुद्दों देखा है, लेकिन मुझे लगता है कि इसका इस्तेमाल करते हुए

X& X::operator=(const X&); 

उपयोग करने के लिए सबसे अच्छा होगा यह, आप ऑब्जेक्ट को चेन-असाइनमेंट में पुन: उपयोग करने में सक्षम होंगे।

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