क्या & & पर अधिभारित करना बुरा विचार है, || या अल्पविराम ऑपरेटर और क्यों?लॉजिकल ऑपरेटर ओवरलोडिंग खराब अभ्यास माना जाता है?
उत्तर
मैं operator&&
या operator||
अधिभारित नहीं करता। यहां तक कि यदि आप एक वर्ग को परिभाषित करते हैं जो बूलियन बीजगणित (उदाहरण के लिए सीमित सेट) को जन्म देता है, तो शायद operator&
और operator|
को अधिभारित करने के लिए यह बेहतर विकल्प होगा।
कारण यह है कि सी ++ प्रोग्रामर operator&&
और operator||
के लिए विशेष अर्थ विज्ञान की उम्मीद है: वे शॉर्ट सर्किट, अर्थात उनके दाएँ हाथ तर्क यदि आवश्यक हो तो नहीं का मूल्यांकन नहीं है। आप इस व्यवहार को ओवरलोडिंग से नहीं प्राप्त कर सकते हैं, क्योंकि आप एक फ़ंक्शन को परिभाषित करेंगे।
ओवरलोडिंग operator,
उदाहरण में किया गया है Boost.Assign पुस्तकालय। यह मेरा ओवरलोडिंग का एकमात्र उदाहरण भी है जो मुझे पता है, और मैंने इसे कभी भी अधिभारित नहीं माना है। आप बेहतर इसके लिए एक बहुत ही विशिष्ट उपयोग केस होगा जहां कोई अन्य ऑपरेटर उपयुक्त नहीं है।
अच्छा बिंदु। तो, ऐसा लगता है कि ऐसे मामले में बूल में रूपांतरण के लिए एक ऑपरेटर प्रदान करना बेहतर है ('ऑपरेटर बूल()')? – davka
@davka: हाँ, 'ऑपरेटर बूल' को परिभाषित करें यदि आपकी कक्षा में बूलियन तर्क अर्थशास्त्र है, जो आपको मुफ्त में शॉर्ट सर्किटिंग देता है। 'ऑपरेटर' और 'ऑपरेटर' को परिभाषित करें। यदि इसमें बूलियन बीजगणित सेमेन्टिक्स हैं, जैसे कि सीमित सेट (जहां चौराहे '' 'है, संघ '' '' है)। –
@Downvoter: कृपया समझाएं। –
सी ++ में लॉजिकल ऑपरेटरों को अधिभारित करने के लिए, ऑपरेटरों का मूल्यांकन किया जाना चाहिए, जो सामान्य रूप से अंतर्निहित प्रकारों के छोटे सर्किटिंग के साथ काम नहीं करते हैं।
नीचे दिए गए लिंक को देखें।
यह प्रश्न में ऑपरेटर के बारे में एक शब्द नहीं कहता है। – davka
ओह। मेरी गलती। माफ़ कीजिये। मैंने सवाल का गलत व्याख्या किया। –
@All: उत्तर –
स्थितियों को छोड़कर इसका बुरा विचार है जब आपके कक्षाएं, कुछ तर्क इकाई का प्रतिनिधित्व करता है क्योंकि अतिभारित ऑपरेटरों गुमराह करना होगा और कोड में नए कीड़े पैदा कर सकता है।
संपादित किया गया जब भी आप "तार्किक संस्थाओं" (बुलीयन बीजगणित) को परिभाषित कर रहे हैं, अन्य ऑपरेटरों बेहतर अनुकूल हैं। –
मैं कहूंगा कि यह आपके ओवरलोड लोड करने पर निर्भर करता है। उदाहरण के लिए, & & और || तार्किक परिस्थितियों के रूप में काम करने की उम्मीद है, इसलिए यदि आपका ओवरलोड सेमेन्टिक्स किसी भी तरह से अलग तरीके से काम करता है, तो वे अन्य लोगों को भ्रमित कर सकते हैं (या यहां तक कि खुद, अगर आप थोड़ी देर के लिए उनका उपयोग नहीं करते हैं और भूल जाते हैं कि वे क्या करते हैं)। इस बात पर विचार करें कि आप ऑपरेटरों से क्या अपेक्षा करेंगे यदि आप नहीं जानते कि वे कैसे ओवरलोड किए गए हैं और यदि यह सामान्य तरीकों का उपयोग करने के लिए स्पष्ट होगा।
जैसा कि अन्य ने कहा है, आलसी मूल्यांकन खोना तार्किक ऑपरेटरों को अधिभारित करने से बचने का मुख्य कारण है।
हालांकि, उन्हें अधिभारित करने का एक बहुत अच्छा कारण है: Expression templates। Boost.Lambda लाइब्रेरी यह करता है, और यह बहुत उपयोगी है!
यह आमतौर पर एक बुरा विचार है: उन तीन ऑपरेटरों के पास अनुक्रमिक प्रभाव होता है जो उन्हें ओवरलोड करते समय खो जाता है। उस अनुक्रमित प्रभाव को खोने से उन लोगों को हाथ (यानी अजीब बग) का कारण बन सकता है जो खोने की अपेक्षा नहीं करते हैं।
ऐसे टेम्पलेट अभिव्यक्तियों के मामले हैं जहां आप अनुक्रमित प्रभाव रख सकते हैं, उन मामलों में मुझे उन्हें ओवरलोड करने में कोई समस्या नहीं है।
operator,
का अधिभार मुझे एक और समस्या है: वे इस तरह से काम करते हैं कि संचालन की स्पष्ट श्रृंखला असली नहीं है। आम तौर पर, जब वे कोई फर्क नहीं पड़ता, तो संदर्भ में उनका उपयोग किया जाता है, लेकिन एक बार नीले चंद्रमा में, यह एक अजीब बग का एक और स्रोत है।
आपको किसी भी ऑपरेटरों को आश्चर्यजनक तरीके से अधिभारित नहीं करना चाहिए।:-)
यदि आप इसे ऐसे तरीके से कर सकते हैं जो समझ में आता है (न केवल आपके लिए), तो ऐसा करना ठीक है।
अन्य लोगों की तरह कहा गया है कि लॉजिकल ऑपरेटर विशेष हैं कि उनके पास आलसी मूल्यांकन का प्रभाव है। तो आपके ओवरलोड को शायद इस आलसी प्रभाव को संरक्षित करना चाहिए, जैसे अभिव्यक्ति टेम्पलेट्स, या केवल तभी उपयोग किया जाए जहां लोग इस प्रभाव की अपेक्षा न करें।
- 1. आउटपुट बफरिंग का उपयोग खराब अभ्यास माना जाता है?
- 2. वैश्विक चर क्यों खराब अभ्यास माना जाता है?
- 3. क्या डॉलर ऑपरेटर ($) खराब फॉर्म माना जाता है? क्यूं कर?
- 4. सी ++ 11 में, ... ऑपरेटर माना जाता है?
- 5. जावास्क्रिप्ट में खराब अभ्यास माना जाता है के साथ '(सूची में var आइटम)' क्यों है?
- 6. क्या यह इकाई निकाय के बिना HTTP पोस्ट करने के लिए खराब अभ्यास माना जाता है?
- 7. आईफोन, isKindOfClass का उपयोग किसी भी तरह से खराब अभ्यास माना जाता है?
- 8. ईको के साथ HTML आउटपुट PHP में खराब अभ्यास माना जाता है?
- 9. नकारात्मक आईडी या शून्य को खराब अभ्यास क्यों माना जाता है?
- 10. क्या यह गैर-मानक HTML विशेषताओं का उपयोग करने के लिए खराब अभ्यास माना जाता है?
- 11. क्या "उदाहरण" ऑपरेटर का यह उपयोग खराब डिजाइन माना जाता है?
- 12. वर्डप्रेस को खराब प्रोग्राम क्यों माना जाता है?
- 13. जावा बाइटकोड "अत्यधिक" संख्या को "खराब" कोड माना जाता है?
- 14. ओवरलोडिंग ऑपरेटर = गैर-सदस्य
- 15. ऑपरेटर ओवरलोडिंग और नामस्थान
- 16. संरक्षित रचनाकारों को अच्छा अभ्यास माना जाता है?
- 17. स्थिर ओओ अभ्यास क्यों नहीं माना जाता है?
- 18. एक्शन.इनवोक का उपयोग कर सबसे अच्छा अभ्यास माना जाता है?
- 19. सी # ऑपरेटर-ओवरलोडिंग
- 20. यूआरएल पोस्ट खराब खराब अभ्यास एनकोडेड?
- 21. ऑपरेटर ओवरलोडिंग और प्राथमिकता
- 22. ऑपरेटर नया ओवरलोडिंग और संरेखण
- 23. ओवरलोडिंग ऑपरेटर एक आधार वर्ग
- 24. ओवरलोडिंग ऑपरेटर << - सी ++
- 25. ऑपरेटर ओवरलोडिंग सी ++
- 26. ऑपरेटर ओवरलोडिंग प्लगइन जावा
- 27. ओवरलोडिंग ऑपरेटर>
- 28. वर्चुअल ऑपरेटर ओवरलोडिंग ->()
- 29. ओवरलोडिंग ऑपरेटर == की शिकायत
- 30. स्कैला: विधि \ ऑपरेटर ओवरलोडिंग
यह अंतिम परीक्षा प्रश्न की तरह लगता है;) – defbyte