2010-02-06 27 views
5

ऑपरेटरों को अधिभारित करते समय,> = < = और! = अधिभारित करना आवश्यक है?ऑपरेटर ओवरलोडिंग सी ++

ऐसा लगता है कि यह सी ++ कॉल करने के लिए स्मार्ट होगा! ऑपरेटर = के लिए! =,!> ऑपरेटर < = और! ऑपरेटर के लिए <> =।

क्या यह मामला है, या हर समारोह को अधिभारित करना आवश्यक है?

उत्तर

2

हाँ, यह आवश्यक है, यदि आप उन सभी को जिस तरह से आप उन्हें काम करना चाहता हूँ काम करना चाहते हैं।

सी ++ अधिकतर अधिभार योग्य ऑपरेटरों पर किसी भी विशिष्ट अर्थशास्त्र को मजबूर नहीं करता है। एकमात्र चीज जो तय की गई है वह ऑपरेटर के लिए सामान्य वाक्यविन्यास है (जिसमें यूनरी या बाइनरी और प्राथमिकता और सहयोगीता जैसी चीजें शामिल हैं)। इसका तत्काल अर्थ यह है कि आपके अधिभार में लागू वास्तविक कार्यक्षमता पूरी तरह से मनमानी हो सकती है। सामान्य स्थिति में ऑपरेटर == क्या करता है और ऑपरेटर != क्या करता है के बीच कोई सार्थक संबंध नहीं हो सकता है। ऑपरेटर == फ़ाइल में डेटा लिख ​​सकता है, जबकि ऑपरेटर != एक सरणी सॉर्ट कर सकता है।

जबकि इस तरह के मनमाने ढंग से फैशन में ऑपरेटरों को अधिभारित करना निश्चित रूप से एक अच्छा प्रोग्रामिंग अभ्यास नहीं है, सी ++ भाषा कुछ भी नहीं मान सकती है। तो, नहीं,के स्थान पर !=, या ! > संयोजन के स्थान पर ! == संयोजन स्वचालित रूप से इसका उपयोग नहीं कर सकता है और नहीं करेगा।

+0

'==' और '! =' के लिए आपका उदाहरण बल्कि दूषित है। एक और यथार्थवादी एक वर्ग ऑब्जेक्ट का प्रतिनिधित्व करने वाला वर्ग होगा, जहां आपको 'न्यूल' के विशेष अर्थशास्त्र से निपटना होगा। – dan04

2

नहीं, आप केवल ऑपरेटर == और ऑपरेटर < ओवरलोड की जरूरत है, मानक पुस्तकालय बाकी :) का ख्याल रखना होगा

(संपादित करें: नाम स्थान std :: rel_ops का उपयोग करके देख;)

+0

ऐसा मत सोचो ऐसा इसलिए है ... यदि यह सच था तो यह पृष्ठ परिभाषित करने का उदाहरण क्यों देगा! = == के संदर्भ में? http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html –

+0

स्पष्टीकरण के लिए धन्यवाद। –

+1

नहीं, यह नहीं होगा, आपको प्रत्येक ऑपरेटर को स्पष्ट रूप से परिभाषित करना होगा। –

0

वहाँ कुछ shortcuts हैं जिनका उपयोग आप सीआरटीपी जैसे automaticallyinjected (विभिन्न तुलना कक्षाओं को देखें) प्राप्त करने के लिए कर सकते हैं।

+2

मुझे आश्चर्य है कि क्यों और स्टैक्स के अब हटाए गए उत्तर को कम वोट दिया गया था। – GManNickG

+0

मुझे मारता है, मैंने बहुत पहले प्रतिनिधि के बारे में चिंता करने को छोड़ दिया, लेकिन मैं अब भी लोगों को जवाबों को प्रभावित करने की कोशिश कर रहे गेम खेल रहा हूं। –

+2

जब आप डाउनवोट करते हैं तो कृपया कारण बताएं। –

7

Boost operators जो भी आप खोज रहे हैं हो सकता है। ये कुछ मौलिक लोगों के आधार पर आपके अधिकांश ऑपरेटरों को प्राप्त करेंगे।

कि सी ++ यह स्वचालित रूप से समझ में नहीं आता है, क्योंकि कोई < और> के लिए पूरी तरह से अलग अर्थ दे सकता है, उदाहरण के लिए (हालांकि यह अक्सर एक बुरा विचार होगा)।

+1

सी ++ इसे std :: rel_ops के रूप में प्रदान करता है, लेकिन इसके बजाय इसे सही तरीके से और संभवतः छोटे से उपयोग करने के लिए मुश्किल है (भ्रम से बचें)। –

0

हाँ! वे प्रत्येक तकनीकी रूप से अलग ऑपरेटरों हैं। सी ++ कंपाइलर्स स्वाभाविक रूप से अनुमान इंजन नहीं हैं, वे पार्सर्स/कंपाइलर्स हैं। वे केवल उतना ही करेंगे जितना आप कहेंगे। http://www.parashift.com/c++-faq-lite/operator-overloading.html, http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

+0

सिवाय इसके कि वे इंजेक्शन इंजन हैं! एडीएल को देखें और एक लंबे लंबे सिरदर्द के लिए फ़ंक्शन ओवरलोड रिज़ॉल्यूशन नियमों को समझें। –

+0

मुझे संदेह है कि बहुत से एआई शोधकर्ता होंगे जो कंप्यूटर विज्ञान में एक अनुमान इंजन की तकनीकी परिभाषा पर आपसे असहमत होंगे। लेकिन हां, आधुनिक कंपाइलर क्या "समझ सकते हैं" प्रभावशाली है। –

+0

परिभाषा मैं उपयोग कर रहा हूं: "एक अनुमान इंजन परिमित राज्य मशीन का एक रूप है जिसमें तीन कार्य होते हैं: नियमों का मिलान, चयन और निष्पादन।" नियम केवल फ़ंक्शन ओवरलोड रिज़ॉल्यूशन और प्रोग्राम में फ़ंक्शंस और प्रकारों की घोषणाओं का संयोजन हैं। कोई तर्क नहीं कि यह वास्तव में प्राचीन है। –

3

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

यह बढ़ावा बिना जटिल सी ++ प्रोग्राम (जो मैं व्यक्तिगत रूप से सौंदर्य की दृष्टि से अप्रिय लगता है) लिखने के लिए संभव है और इसलिए रखने के लिए यह सरल (बेवकूफ), ओपी के सवाल का जवाब देने, अगर आप operator == ओवरलोड, आप भी operator != ओवरलोड चाहिए। वही,, < के लिए सच है >++ आदि

+2

यदि आपको किसी भी कारण से बढ़ावा देना पसंद नहीं है, तो इसका मतलब यह नहीं है कि आप एक ही तकनीक का उपयोग नहीं कर सकते हैं। मेरे उत्तर में एक एकल, स्वयं निहित शीर्षलेख का एक लिंक शामिल है जिसे मैंने इस मामले में बिल्कुल ठीक करने के उदाहरण के रूप में लिखा था। –

+0

मैं सिर्फ सवाल का जवाब दे रहा हूं - सी ++ स्वचालित रूप से 'ऑपरेटर ==' को कॉल नहीं करता है और परिणाम को उलटा करता है जब '! =' परिभाषित नहीं किया जाता है। इस पर विवाद नहीं करना कि ऐसा करने का एक स्वैच्छिक तरीका है। –

1

हां, जो भी ऑपरेटरों आप उन्हें परिभाषित करना चाहते हैं उन्हें अधिभारित करना आवश्यक है - सी ++ ऊपर वर्णित निर्णय नहीं लेगा; हालांकि, ध्यान रखें कि यदि आप ओवरलोडिंग कर रहे हैं तो अपनी कक्षा को सॉर्ट करना है, आपको केवल नियमित रूप से इस्तेमाल किए गए ऑपरेटरों को ओवरराइड करने की आवश्यकता है। आरटीएल सॉर्ट एल्गोरिदम के मामले में आपको केवल < और = को ओवरराइड करने की आवश्यकता है।

0

आप उपयोगकर्ता परिभाषित नामों का उपयोग करने के लिए ओवरलोडिंग का उपयोग कर सकते हैं। ऑपरेटर ओवरलोडिंग का मतलब है कि उसी श्रेणी में ऑपरेशन करने के लिए उसी ऑपरेटर का उपयोग करना जो उस श्रेणी में नहीं है। फ़ंक्शन ओवरलोडिंग का अर्थ फ़ंक्शन के समान नाम का उपयोग करना है, लेकिन विभिन्न तर्क, ताकि ओवरहेड को दूर करने के लिए जब लूपिंग के दौरान एक ही फ़ंक्शन को कॉल किया जाता है।

0

सी ++ किसी भाषा के रूप में नहीं, किसी अन्य ओवरलोडेड ऑपरेटर के मामले में किसी भी ऑपरेटर को परिभाषित करता है। सिर्फ इसलिए कि आपके पास operator+ है, इसका मतलब यह नहीं है कि आपको operator+= मुफ्त में (रूबी और स्कैला के विपरीत) मिलता है। सिर्फ इसलिए कि आपके पास ऑपरेटर < और == है इसका मतलब यह नहीं है कि आपको <= मुफ्त में मिलता है। सिर्फ इसलिए कि आपके पास ऑपरेटर == है इसका मतलब यह नहीं है कि आपको != मुफ्त में (रूबी और स्कैला के विपरीत) मिलता है। सिर्फ इसलिए कि आपके पास operator * (यूनरी) नहीं है, इसका मतलब यह नहीं है कि आपको operator -> मुफ्त में मिलता है।

std::relops (यदि सही तरीके से आयात किया गया है) और डिफ़ॉल्ट परिभाषाएं प्रदान करते हैं, और बूस्ट कुछ मिश्रण-इन्स प्रदान करता है जो < और == के संदर्भ में सभी तुलना ऑपरेटर को परिभाषित करता है।

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