2012-11-16 20 views
5

जब कोई वर्ग operator+ ओवरलोड करता है, तो इसे कॉन्स घोषित किया जाना चाहिए क्योंकि यह ऑब्जेक्ट पर कोई असाइनमेंट नहीं करता है? इसके अलावा, मुझे पता है कि operator= और operator+= एक संदर्भ लौटाता है क्योंकि एक असाइनमेंट किया जाता है। लेकिन, operator+ के बारे में क्या? जब मैं इसे कार्यान्वित करता हूं तो क्या मुझे वर्तमान ऑब्जेक्ट की प्रतिलिपि बनाना चाहिए, उस ऑब्जेक्ट को उसमें जोड़ें, और उस मान को वापस कर दें?सी ++ - क्या मुझे 'ऑपरेटर +' कॉन्स बनाना चाहिए? और क्या यह एक संदर्भ वापस करता है?

class Point 
{ 
public: 
    int x, int y; 

    Point& operator += (const Point& other) { 
     X += other.x; 
     Y += other.y; 
     return *this; 
    } 

    // The above seems pretty straightforward to me, but what about this?: 
    Point operator + (const Point& other) const { // Should this be const? 
     Point copy; 
     copy.x = x + other.x; 
     copy.y = y + other.y; 
     return copy; 
    } 
}; 

इस operator+ का सही कार्यान्वयन है:

यहाँ मैं क्या किया है? या क्या ऐसा कुछ है जो मुझे अनदेखा कर रहा है जो परेशानी या अवांछित/अपरिभाषित व्यवहार कर सकता है?

+1

ऑपरेटर ओवरलोडिंग के कई विवरण यहां पाए जा सकते हैं: http://stackoverflow.com/questions/4421706/operator-overloading – chris

उत्तर

6

कि तुलना में बेहतर है, आप इसे एक नि: शुल्क कार्य करना चाहिए:

Point operator+(Point lhs, const Point& rhs) { // lhs is a copy 
    lhs += rhs; 
    return lhs; 
} 

लेकिन हाँ, यदि आप इसे एक सदस्य समारोह के रूप में छोड़ यह const होना चाहिए यह बाएं हाथ की ओर वस्तु संशोधित नहीं करता है के रूप में।

के बारे में एक संदर्भ या एक प्रति वापस जाने के लिए है कि क्या, ऑपरेटर ओवरलोडिंग के लिए सलाह (अर्थात के रूप में int रों करते हैं) के रूप में मूल प्रकारों करना करते हैं। इस मामले में, दो पूर्णांक के लिए अतिरिक्त एक अलग पूर्णांक देता है जो इनपुट में से किसी एक का संदर्भ नहीं है।

+0

आह, मैं देखता हूं। धन्यवाद। इसके अलावा, इसे एक मुफ्त समारोह के रूप में रखने का क्या फायदा है? –

+1

@ ब्रैंडनमिलर: समरूपता प्रकारों का सम्मान। यदि आपके प्रकार में एक अंतर्निहित रूपांतरण कन्स्ट्रक्टर है (यानी किसी अन्य प्रकार से निहित रूप से परिवर्तित किया जा सकता है), नि: शुल्क फ़ंक्शन कार्यान्वयन दोनों तर्कों पर रूपांतरण की अनुमति देगा, जबकि सदस्य फ़ंक्शन केवल दाएं हाथ पर रूपांतरण कर सकता है। –

+0

कुछ अच्छी जानकारी वहाँ! मैंने कभी इसके बारे में सोचा नहीं था। –