2012-05-04 7 views
6

मैं पढ़ रहा हूँ सी ++ प्राइमर, अतिभारित आपरेशन अध्याय में, लेखक का उदाहरण दिया:सी ++ में ऑपरेटरों के रिटर्न प्रकार क्या हैं?

// member binary operator: left-hand operand bound to implicit this pointer 
Sales_item& Sales_item::operator+=(const Sales_item&); 
// nonmember binary operator: must declare a parameter for each operand 
Sales_item operator+(const Sales_item&, const Sales_item&); 

तो, लेखक समझाया:

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

मुझे "compound assignment returns a reference to the left-hand operand" के बारे में बिल्कुल यकीन नहीं है। क्या कोई उस पर और प्रासंगिक चीजों को विस्तारित कर सकता है?

+0

विधि श्रृंखला को देखो। इसका मूल रूप से अर्थ है 'ए = बी' रिटर्न 'ए' ताकि' c = a = b' 'c = (a = b)' या 'a = b' का मूल्यांकन करता है, फिर' c = a' सभी 1 कथन में। – chris

उत्तर

5

इसका मतलब है कि आप निम्नलिखित

a = 1; 
(a += 1) += 1; 

की तरह कुछ कर सकते हैं और परिणाम एक == 3. यह है हो जाएगा कि क्योंकि + = a को संशोधित करता है और उसके बाद के लिए एक संदर्भ रिटर्न के लिए छोड़ दिया सबसे कॉल यह। फिर अगला + = a के संदर्भ पर चलता है और फिर इसे एक संख्या जोड़ता है।

दूसरी तरफ, सामान्य + ऑपरेटर परिणाम के प्रति प्रतिलिपि देता है, तर्कों में से किसी एक का संदर्भ नहीं। तो इसका मतलब है कि a + a = 3; जैसी अभिव्यक्ति अवैध है।

+1

"' ए + = 1 + = 1; '"। [क्या आप इसके बारे में निश्चित हैं?] (Http://ideone.com/wK93x) –

+0

@ रोब: वह निश्चित रूप से इसके बारे में निश्चित है। लेकिन इसका मतलब यह नहीं है कि वह सही है। गलत जवाब के लिए -1। – Nawaz

+1

@ नवाज: मुझे डाउनवोट थोड़ा कठोर लगता है, क्योंकि इसे हल किया गया है [केवल कोष्ठक की एक जोड़ी] (http://ideone.com/hdhf1)।यौगिक असाइनमेंट का सार उत्तर में कब्जा कर लिया गया है, इसलिए डेविस को विफल कर दिया क्योंकि वह एक साधारण मुद्दे (व्हाइटबोर्ड का आर्टिफैक्ट) पर ट्राइप कर रहा था। –

2
a = a + b; 

भी

a += b; 

जो करने के लिए

a.operator+= (b) 

ऑपरेटर बराबर है है + = यौगिक काम का समर्थन करता है:

(a += b) += c; 

के बराबर है
a.operator+= (b).operator+= (c); 

अंतिम पंक्ति तब संभव नहीं होगी जब एक मूल्य के बदले एक मूल्य वापस किया गया हो।

निम्नलिखित पर विचार करें:

c = a + b; 

भी

c = a.operator+ (b); 

लेखन

a.operator+ (b) = c; 

कोई प्रभाव नहीं है, क्योंकि एक के मान नहीं बदला गया है है।