5

कृपया पर विचार कोडअधिक भार पोस्टफ़िक्स और उपसर्ग ऑपरेटरों

#include <iostream> 
using namespace std; 
class Digit 
{ 

private: 
    int m_digit; 
public: 
    Digit(int ndigit=0){ 
    m_digit=ndigit; 
         } 
    Digit& operator++();//prefix 
    Digit& operator--(); //prefix 
     Digit operator++(int); 
     Digit operator--(int); 
     int get() const { return m_digit;} 
}; 
Digit& Digit::operator++(){ 

    ++m_digit; 
    return *this; 
} 
Digit& Digit::operator--(){ 
--m_digit; 
return *this; 

} 
Digit Digit::operator++(int){ 
Digit cresult(m_digit); 
++(*this); 
return cresult; 


} 
    Digit Digit::operator--(int){ 
Digit cresult(m_digit); 
--(*this); 
return cresult; 


} 
    int main(){ 

    Digit cDigit(5); 
     ++cDigit; 
     cDigit++; 
     cout<<cDigit.get()<<endl; 
     cout<<cDigit.get()<<endl; 





    return 0; 
    } 
यहाँ

निम्नलिखित पोस्टफ़िक्स और उपसर्ग ऑपरेटरों के दो संस्करण कार्यान्वित किया जाता है, मैं पढ़ लिया है कि अंतर एक और तथाकथित डमी तर्क परिचय द्वारा किया जाता है, लेकिन मैं अगर सवाल है हम इन

Digit& operator++();//prefix 
      Digit& operator--(); //prefix 
     Digit operator++(int); 
     Digit operator--(int); 

वे & निशान से मतभेद रहे हैं की घोषणा को देखते हैं, तो क्यों यह दोनों मामले उदाहरण के लिए ++ ऑपरेटर तर्क से पहले लिखा गया था और करता है में आवश्यक डमी तर्क है? और यह भी नहीं तो इसका मतलब है कि वे वही?

उत्तर

9

पूर्व और बाद में वृद्धि दो विशिष्ट ऑपरेटरों हैं, और अलग अधिभार की आवश्यकता है।

सी ++ पूरी तरह से रिटर्न प्रकार पर ओवरलोडिंग की अनुमति नहीं देता है, इसलिए आपके उदाहरण में अलग-अलग रिटर्न प्रकार होने के कारण दोनों विधियों को असंबद्ध करने के लिए पर्याप्त नहीं होगा।

डमी तर्क वह तंत्र है जो सी ++ के डिजाइनर ने असंबद्धता के लिए चुना है।

+0

मुझे लगता है कि हाथ में या कहीं कहीं एक संकेत है कि यह विघटन के लिए चुनी गई विधि क्यों थी। जवाब शायद उतना सरल है जितना "कोई दूसरा रास्ता नहीं था।" –

2

ऑपरेटर, जैसा कि किसी भी फ़ंक्शन को हस्ताक्षर द्वारा पहचाना जाता है। फ़ंक्शन/ऑपरेटर नाम से पहले रिटर्न प्रकार और संशोधक इस में शामिल नहीं हैं। आपके ऑपरेटरों के नाम यहां हैं

operator++() 
operator++(int) 

यह एकमात्र तरीका है जो संकलक दोनों के बीच अंतर करता है। Digit& और Digit वापसी मूल्यों के लिए; वे ++ x, और x ++ के तरीके के कारण काम करने की आवश्यकता है।

2

सी ++ कार्यों/विधियों में वापसी प्रकार द्वारा अधिभारित नहीं किया जा सकता है, केवल पैरामीटर सूची द्वारा। इस तथ्य को अनदेखा करते हुए कि उपसर्ग और पोस्टफिक्स ऑपरेटर ऑपरेटर हैं, कल्पना करें कि क्या वे केवल साधारण कार्य थे, संकलक कैसे काम करेगा जो रिटर्न प्रकार के आधार पर उपयोग करेगा? जैसे

int x = 2; 

const int DoIt() 
{ 
    return 1; 
} 

int& DoIt() 
{ 
    return x; 
} 

int y = DoIt(); 

के बाद ऑपरेटर भार के वास्तव में सिर्फ दिल में कार्य हैं, वहाँ संकलक वापसी प्रकार से उन दोनों के बीच अंतर करने के लिए कोई रास्ता नहीं है।

देखें http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.14

1

पूर्व वृद्धि/कमी और बाद वृद्धि/कमी में, अंतर अतिभारित समारोह में केवल डमी पैरामीटर पर आधारित है

operator++()   => Prefix Increment 
operator--()   => Prefix Decrement 

operator++(int)  => Postfix Increment 
operator--(int)  => Postfix Decrement 

वापसी प्रकार एक ही हो सकता है। आप यह भी संदर्भित कर सकते हैं: http://www.tutorialspoint.com/cplusplus/increment_decrement_operators_overloading.htm

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