2016-11-03 5 views
9
class A { 
public: 
    string operator+(const A& rhs) { 
     return "this and A&"; 
    } 
}; 

string operator+(const A& lhs, const A& rhs) { 
    return "A& and A&"; 
} 

string operator-(const A& lhs, const A& rhs) { 
    return "A& and A&"; 
} 

int main() { 
    A a; 
    cout << "a+a = " << a + a << endl; 
    cout << "a-a = " << a - a << endl; 
    return 0; 
} 

//output 
a+a = this and A& 
a-a = A& and A& 

मुझे उत्सुकता है कि कक्षा के अंदर ऑपरेटर को बाहर की बजाय क्यों कहा जाता है। क्या ऑपरेटर के बीच कुछ प्राथमिकता है?कक्षा के अंदर एक ऑपरेटर कैसे काम करता है?

+4

उसी नाम के कई कार्यों के बीच चयन करने की प्रक्रिया को * ओवरलोड रिज़ॉल्यूशन * कहा जाता है। इस कोड में, सदस्य को प्राथमिकता दी जाती है क्योंकि गैर-सदस्य को योग्यता रूपांतरण की आवश्यकता होती है ('const' को' lhs' जोड़ना) लेकिन सदस्य नहीं करता है। यदि आपने सदस्य को 'const'' (जिसे आपको करना चाहिए, क्योंकि यह '* यह' को संशोधित नहीं करता है) तो यह संदिग्ध होगा –

उत्तर

4

एक ही नाम के कई कार्य के बीच चयन करने की प्रक्रिया अधिभार संकल्प कहा जाता है। इस कोड में, सदस्य को प्राथमिकता दी जाती है क्योंकि गैर-सदस्य को योग्यता रूपांतरण की आवश्यकता होती है (constlhs जोड़ना) लेकिन सदस्य नहीं करता है। यदि आपने सदस्य फ़ंक्शन const (जिसे आपको करना चाहिए, क्योंकि यह *this संशोधित नहीं करता है) तो यह संदिग्ध होगा।

1

जब भी आपका ऑब्जेक्ट नॉन-कॉन्स्ट होता है तो स्थिरता पर गैर-स्थिरता की प्राथमिकता होती है। अंदरूनी को बुलाया जाएगा जब बायीं ओर नॉन-कॉन्स होता है, और बाईं तरफ होने पर बाहरी को बुलाया जाएगा।

क्या होता है देखने के लिए कि आंतरिक रूप में परिभाषित किया गया है:

string operator+(const A& rhs) const;

+1

"स्थिरता पर गैर-स्थिरता की प्राथमिकता है।" सामान्य मामले में नहीं। यदि 'ए' को 'कॉन्स्ट ए ए' के ​​रूप में घोषित किया गया था, तो ऑफ-ऑफ-क्लास अधिभार का उपयोग किया जाएगा। – Angew

+0

यही मैंने लिखा है। – Shloim

+1

जिस तरह से उत्तर लिखा गया है, "सामान्य स्थिति की तरह लगता है" स्थिरता पर गैर-स्थिरता की प्राथमिकता है। जो निश्चित रूप से गलत होगा। – Angew

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