स्केला के संचालक ओवरलोडिंग को "अच्छा" बनाते हैं, लेकिन C ++ का "बुरा"?


155

C ++ में ऑपरेटर ओवरलोडिंग को कई लोग ए बैड थिंग (टीएम) मानते हैं, और नई भाषाओं में दोहराया नहीं जाना एक गलती है। निश्चित रूप से, यह जावा डिजाइन करते समय विशेष रूप से गिराए गए एक फीचर था

अब जब मैंने स्काला पर पढ़ना शुरू कर दिया है, तो मुझे लगता है कि इसमें बहुत कुछ दिखता है जो ऑपरेटर को ओवरलोडिंग जैसा लगता है (हालांकि तकनीकी रूप से इसमें ऑपरेटर ओवरलोडिंग नहीं है क्योंकि इसमें ऑपरेटर नहीं हैं, केवल फ़ंक्शन हैं)। हालाँकि, यह C ++ में ओवरलोडिंग करने वाले ऑपरेटर के लिए गुणात्मक रूप से भिन्न नहीं होगा, जहां मुझे याद है कि ऑपरेटरों को विशेष कार्यों के रूप में परिभाषित किया गया है।

तो मेरा सवाल यह है कि स्काला में "+" को परिभाषित करने के विचार को C ++ से बेहतर विचार क्या है?


27
सभी प्रोग्रामरों के बीच सार्वभौमिक सहमति से न तो C ++ नहीं स्कैला को परिभाषित किया गया था। मुझे नहीं लगता कि इस तथ्य के बीच कोई विरोधाभास है कि कुछ लोग सी ++ के बारे में कहते हैं, और यह तथ्य कि कुछ लोग स्काला के बारे में नहीं कहते हैं।
स्टीव जेसप जूल

16
सी ++ में ऑपरेटर ओवरलोडिंग के बारे में कुछ भी बुरा नहीं है।
प्यूरी

5
यह कुछ भी नया नहीं है, लेकिन जिस तरह से मैं सी ++ का बचाव करता हूं, जब ऑपरेटर ओवरलोडिंग और अन्य "उन्नत" विशेषताओं को प्रश्न में बुलाया जाता है, सरल है: सी ++ हमें फिट होने के साथ ही इसका उपयोग / दुरुपयोग करने की सारी शक्ति देता है। मुझे हमेशा यह पसंद आया है कि कैसे हमें सक्षम और स्वायत्त माना जाए और हमें इस तरह के निर्णय लेने की आवश्यकता नहीं है।
इलियट

स्केल को c ++ के बाद के दशकों की तरह डिजाइन किया गया था। प्रोग्रामिंग लैंग्वेज के मामले में इसके पीछे का व्यक्ति सुपर सेवेंट है। या तो के बारे में प्रति से बुरा कुछ भी नहीं है, अगर आप एक और 100 वर्षों के लिए सी ++ या स्काला से चिपके रहते हैं तो यह स्पष्ट हो जाता है कि शायद दोनों खराब हैं! पक्षपाती होना हमारे स्वभाव में स्पष्ट है लेकिन हम इससे लड़ सकते हैं, बस तकनीक के इतिहास को देखें, तो सब कुछ पुराना हो गया है।
नादर घनबारी

जवाबों:


242

C ++ को C से असली नीले रंग के ऑपरेटर मिलते हैं। मेरा मतलब है कि 6 + 4 में "+" बहुत खास है। उदाहरण के लिए, आप उस + फ़ंक्शन के लिए एक संकेतक प्राप्त नहीं कर सकते।

दूसरी तरफ स्काला के पास उस तरह से ऑपरेटर नहीं हैं। यह सिर्फ गैर-शब्द प्रतीकों के लिए पूर्वता में निर्मित बिट नामों को परिभाषित करने में बहुत लचीलापन है। इसलिए तकनीकी रूप से स्काला में ऑपरेटर ओवरलोडिंग नहीं है।

जो भी आप इसे कॉल करना चाहते हैं, ऑपरेटर ओवरलोडिंग स्वाभाविक रूप से खराब नहीं है, यहां तक ​​कि सी ++ में भी। समस्या तब होती है जब खराब प्रोग्रामर इसका दुरुपयोग करते हैं। लेकिन स्पष्ट रूप से, मेरी राय है कि प्रोग्रामर को ओवरलोडिंग के दुरुपयोग के लिए प्रोग्रामर की क्षमता को हटाने के लिए सभी चीजों को ठीक करने की बाल्टी में एक बूंद नहीं डालनी चाहिए जो प्रोग्रामर दुरुपयोग कर सकते हैं। असली जवाब मेंटरिंग है। http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html

कोई भी कम नहीं, C ++ के ऑपरेटर ओवरलोडिंग और स्काला के लचीले तरीके के नामकरण के बीच अंतर हैं, जो IMHO, Scala को कम अपमानजनक और अधिक अपमानजनक बनाते हैं।

C ++ में इन-फिक्स नोटेशन प्राप्त करने का एकमात्र तरीका ऑपरेटरों का उपयोग कर रहा है। अन्यथा आपको object.message (तर्क) या पॉइंटर-> मैसजेज (तर्क) या फ़ंक्शन (तर्क 1, तर्क 2) का उपयोग करना चाहिए। इसलिए यदि आप अपने कोड के लिए एक निश्चित डीएसएलिश शैली चाहते हैं तो ऑपरेटरों का उपयोग करने का दबाव है।

स्काला में आप किसी भी संदेश भेजने के साथ infix संकेतन प्राप्त कर सकते हैं। "ऑब्जेक्ट संदेश तर्क" पूरी तरह से ठीक है, जिसका अर्थ है कि आपको केवल इन्फिक्स नोटेशन प्राप्त करने के लिए गैर-शब्द प्रतीकों का उपयोग करने की आवश्यकता नहीं है।

C ++ ऑपरेटर ओवरलोडिंग अनिवार्य रूप से C ऑपरेटरों तक सीमित है। सीमा के साथ संयुक्त है कि केवल ऑपरेटरों का उपयोग किया जा सकता है infix, जो लोगों पर दबाव डालता है कि "+" और ">>" जैसे अपेक्षाकृत कुछ प्रतीकों पर असंबंधित अवधारणाओं की एक विस्तृत श्रृंखला को मैप करने का प्रयास करें।

स्काला विधि नामों के रूप में मान्य गैर-शब्द प्रतीकों की एक विशाल श्रृंखला की अनुमति देता है। उदाहरण के लिए, मुझे एक एम्बेडेड Prolog-ish DSL मिला है जहाँ आप लिख सकते हैं

female('jane)!         // jane is female
parent('jane,'john)!   // jane is john's parent
parent('jane, 'wendy)! // jane is wendy's parent

mother('Mother, 'Child) :- parent('Mother, 'Child) & female('Mother) //'// a mother of a child is the child's parent and is female

mother('X, 'john)?  // find john's mother
mother('jane, 'X)?  // find's all of jane's children

: - -, ;,; और & प्रतीकों को साधारण विधियों के रूप में परिभाषित किया गया है। C ++ में केवल और यह मान्य होगा कि इस DSL को C ++ में मैप करने के प्रयास के लिए कुछ प्रतीकों की आवश्यकता होगी जो पहले से ही बहुत अलग अवधारणाओं को विकसित करते हैं।

बेशक, यह स्कैला को दूसरे प्रकार के दुरुपयोग के लिए भी खोलता है। यदि आप चाहते हैं तो Scala में आप $ $! & ^% का नाम रख सकते हैं।

अन्य भाषाओं के लिए, जैसे कि स्काला, गैर-शब्द फ़ंक्शन के उपयोग में लचीली हैं और विधि के नाम स्मॉलटाक देखते हैं, जहां, स्काला की तरह, प्रत्येक "ऑपरेटर" सिर्फ एक और विधि है और हास्केल जो प्रोग्रामर को लचीले रूप से नाम की पूर्ववर्तीता और शुद्धता को परिभाषित करने की अनुमति देता है। कार्य करता है।


आखिरी बार मैंने जाँच की, 3.ऑपरेटर + (5) ने काम किया। मैं वास्तव में हैरान हूं कि & (3.opter +) नहीं करता है।
जोशुआ

उदाहरण के लिए आप c ++ में assert (महिला ("jane")) कर सकते हैं। यह बिल्कुल भी भ्रामक नहीं होगा - इसके बारे में james-iry पोस्ट पर वापस जाएं कि ऑपरेटर + बैड थिंग नहीं है, लेकिन बेवकूफ प्रोग्रामर हैं।
दोपहर

1
@ int main() {return (3).operator+(5);}error: request for member ‘operator+’ in ‘3’, which is of non-class type ‘int’
जोशुआ का

यह अभिमानी बकवास का एक गुच्छा है: "ऑपरेटर ओवरलोडिंग स्वाभाविक रूप से बुरा नहीं है, यहां तक ​​कि सी ++ में भी। समस्या यह है कि जब खराब प्रोग्रामर इसका दुरुपयोग करते हैं।" यदि किसी चीज का उपयोग करने से काफी कम लाभ के साथ आसानी से अपमानजनक है, तो कुल मिलाकर परिणाम यह है कि आपके कोड को बनाए रखने वाला अगला आदमी आपके कोड के वेडर भागों को नष्ट करने में उत्पादकता खो देगा। अन्यथा: बहुत जानकारीपूर्ण और अच्छी तरह से लिखित उत्तर।
जुक्का डाहलबॉम

@JukkaDahlbom स्मार्ट पॉइंटर्स का अस्तित्व अपने आप ही लाभ को बड़ा बनाता है। और फिर आपके पास लैम्ब्डा, उपयोगकर्ता-परिभाषित संख्या प्रकार, अंतराल प्रकार हैं ...
एलेक्सी रोमानोव

66

C ++ में ऑपरेटर ओवरलोडिंग को कई लोग ए बैड थिंग (tm) मानते हैं।

केवल अज्ञानी द्वारा। C ++ जैसी भाषा में इसकी पूरी आवश्यकता है, और यह ध्यान देने योग्य है कि अन्य भाषाओं ने "प्यूरिस्ट" दृश्य लेना शुरू कर दिया है, एक बार उनके डिजाइनरों ने यह पता लगा लिया है कि यह कितना आवश्यक है।


30
मैं वास्तव में नील से सहमत हूं। ऑपरेटर ओवरलोडिंग आवश्यक है यदि आप चर / स्थिरांक / वस्तुओं / उदाहरणों को बीजगणितीय संस्थाओं के रूप में प्रस्तुत करना चाहते हैं ... और क्या लोग गणितीय फैशन में अपनी बातचीत को समझते हैं - यह होना चाहिए कि प्रोग्रामिंग IMHO कैसे काम करता है।
मस्सा

16
+1, C ++ में ऑपरेटर ओवरलोडिंग अच्छा है। उदाहरण के लिए, यह वेक्टर गणित को बहुत क्लीनर बनाता है जैसे कई C ++ फीचर्स के साथ, आपको पॉवर को ध्यान से देखना चाहिए।
जॉन स्मिथ

7
@ क्रिस्टो क्योंकि C ++ उन मानों का उपयोग करता है जिन्हें असाइन और कॉपी किया जाना चाहिए। उस पर नियंत्रण होना आवश्यक है, इसलिए आपको दिए गए प्रकार के लिए असाइनमेंट ऑपरेटर को कम से कम निर्दिष्ट करने में सक्षम होना चाहिए।

7
@ क्रिस्तो: क्योंकि सी ++ का एक उद्देश्य उपयोगकर्ता-परिभाषित प्रकारों को सब कुछ करने की अनुमति देना है जो बिलियन प्रकार करते हैं (यद्यपि वे कुछ संदर्भों में अलग-अलग व्यवहार किए जाते हैं जैसे कि अंतर्निहित रूपांतरण)। यदि आप 27-बिट पूर्णांक को लागू करना चाहते हैं, तो आप कर सकते हैं, और इसका उपयोग करना इंट की तरह ही होगा। ऑपरेटर ओवरलोडिंग के बिना, बिल्ड प्रकार के रूप में समान सिंटैक्स के साथ यूडीटी का उपयोग करना संभव नहीं होगा, और इसलिए परिणामी भाषा इस अर्थ में "सी ++ की तरह" नहीं होगी।
स्टीव जेसोप

8
"यह तरीका पागलपन है" - इससे भी बदतर, वह रास्ता std :: वेक्टर <bool> है!
स्टीव जेसोप

42

ऑपरेटर अधिभार को कभी भी सार्वभौमिक रूप से C ++ में एक बुरा विचार नहीं माना गया था - बस ऑपरेटर ओवरलोडिंग के दुरुपयोग को एक बुरा विचार माना गया था। किसी को वास्तव में किसी भाषा में ऑपरेटर की ओवरलोडिंग की आवश्यकता नहीं होती है क्योंकि वे अधिक वर्बोज़ फ़ंक्शन कॉल के साथ सिम्युलेटेड हो सकते हैं। जावा में ओवरलोडिंग से बचने वाले ऑपरेटर ने जावा के कार्यान्वयन और विनिर्देश को थोड़ा सरल बना दिया और इसने प्रोग्रामर्स को ऑपरेटरों का दुरुपयोग न करने के लिए मजबूर किया। ऑपरेटर ओवरलोडिंग शुरू करने के बारे में जावा समुदाय में कुछ बहस हुई है।

स्काला में ऑपरेटर ओवरलोडिंग के फायदे और नुकसान सी ++ में समान हैं - यदि आप ऑपरेटर को ओवरलोडिंग के लिए उचित रूप से उपयोग करते हैं तो आप अधिक प्राकृतिक कोड लिख सकते हैं - और यदि आप नहीं करते हैं तो अधिक गूढ़, अस्पष्ट कोड।

FYI करें: ऑपरेटरों को C ++ में विशेष कार्यों के रूप में परिभाषित नहीं किया जाता है, वे किसी भी अन्य फ़ंक्शन की तरह ही व्यवहार करते हैं - हालांकि नाम देखने में कुछ अंतर हैं, चाहे उन्हें सदस्य कार्य करने की आवश्यकता हो, और तथ्य यह है कि उन्हें दो तरीकों से बुलाया जा सकता है: 1 ) ऑपरेटर सिंटैक्स, और 2) ऑपरेटर-फ़ंक्शन-आईडी सिंटैक्स।


"किसी को वास्तव में किसी भाषा में ओवरलोडिंग के लिए ऑपरेटर की आवश्यकता नहीं होती है क्योंकि उन्हें और अधिक वर्बोज़ फ़ंक्शन कॉल के साथ जोड़ा जा सकता है।" किसी को भी वास्तव में उस तर्क के तहत ऑपरेटरों की आवश्यकता नहीं है। सिर्फ उपयोग क्यों नहीं add(2, multiply(5, 3))?
जो जेड

यह अधिक इस्तेमाल किए जाने वाले सामान्य नोटों के मिलान का मामला है। गणितज्ञों और भौतिकविदों पर विचार करें, वे सी ++ लाइब्रेरी को समझ और उपयोग कर सकते हैं जो ऑपरेटरों को अधिक आसानी से ओवरलोड प्रदान करता है। वे प्रोग्रामिंग भाषा की बजाय समीकरण पर ध्यान केंद्रित करेंगे।
फिल राइट

19

यह लेख - " द पॉज़िटिव लिगेसी ऑफ़ सी ++ और जावा " - आपके प्रश्न का सीधा उत्तर देता है।

"सी ++ में स्टैक आवंटन और ढेर आवंटन दोनों हैं और आपको अपने ऑपरेटरों को सभी स्थितियों को संभालने के लिए अधिभार देना चाहिए और मेमोरी लीक का कारण नहीं बनना चाहिए। वास्तव में मुश्किल है। जावा, हालांकि, एक एकल भंडारण आवंटन तंत्र और एक कचरा संग्रहकर्ता है, जो ऑपरेटर को ओवरलोडिंग से निपटने का मौका देता है"। ..

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

शुक्र है, स्काला जैसी उच्च स्तरीय भाषाएं डेवलपर्स को विकल्प देती हैं, जबकि अभी भी उसी जेवीएम पर चल रही हैं।


14
एकेल एकमात्र स्रोत है जिसे मैंने कभी इस विचार के लिए देखा है कि सी ++ में जटिलताओं के कारण ऑपरेटर ओवरलोडिंग को जावा से खोदा गया था और वह यह नहीं कहता कि उसका स्रोत क्या है। मैं इसे छूट देता। अन्य सभी स्रोतों का कहना है कि संभावित दुर्व्यवहार के कारण इसे खोदा गया था। Gotw.ca/publications/c_family_interview.htm और newt.com/wohler/articles/james-gosling-ramblings-1.html देखें । बस पेज उन्हें "ऑपरेटर ओवरलोडिंग" के लिए खोजता है।
जेम्स इरी

9

ऑपरेटर ओवरलोडिंग में कुछ भी गलत नहीं है। वास्तव में, संख्यात्मक प्रकारों के लिए ऑपरेटर ओवरलोडिंग नहीं होने के साथ कुछ गड़बड़ है । (कुछ जावा कोड पर एक नज़र डालें जो BigInteger और BigDecimal का उपयोग करता है।)

C ++ में सुविधा का दुरुपयोग करने की परंपरा है, हालांकि। एक अक्सर उद्धृत उदाहरण यह है कि बिटशिफ्ट ऑपरेटरों को I / O करने के लिए अतिभारित किया जाता है।


<< और >> ऑपरेटरों नेत्रहीन हस्तांतरण के रास्ते संकेत कर रहे हैं, वे कर रहे हैं मतलब , आई / ओ, इसे दुरुपयोग नहीं कर रहा है क्या करने के लिए यह मानक पुस्तकालय और व्यावहारिक बात से है। बस "सिने >> कुछ" को देखो, कहाँ जाता है? स्पष्ट रूप से, कुछ करने के लिए।
पीनट सिप

7
@peenut: लेकिन उनका मूल उपयोग बिट-शिफ्टिंग था। "मानक पुस्तकालय" ऑपरेटर को एक तरह से उपयोग करता है जो मूल परिभाषा के साथ पूरी तरह से गड़बड़ करता है।
जो जेड

1
मुझे यकीन है कि मैंने कहीं पढ़ा है कि Bjarne Stroustrup (C ++ का निर्माता) ने C ++ के शुरुआती दिनों में और =इसके बजाय प्रयोग किया है , लेकिन समस्याओं में भाग गया क्योंकि इसमें सही ऑपरेटर पूर्वता नहीं थी (यानी यह दिखता है) बाएं या दाएं पर तर्क)। इसलिए उसके हाथ थोड़े बंधे थे कि वह क्या इस्तेमाल कर सकता था। <<>>
फिल राइट

8

सामान्य तौर पर यह कोई बुरी बात नहीं है।
नई भाषाओं जैसे C # में ऑपरेटर ओवरलोडिंग भी है।

यह ऑपरेटर की ओवरलोडिंग का दुरुपयोग है जो एक बुरी बात है।

लेकिन C ++ में परिभाषित ऑपरेटर ओवरलोडिंग के साथ समस्याएं भी हैं। क्योंकि अधिभार संचालक केवल विधि के लिए सिंटैक्टिक शुगर हैं वे विधि की तरह व्यवहार करते हैं। दूसरी ओर सामान्य बिल्ट-इन ऑपरेटर्स तरीकों की तरह व्यवहार नहीं करते हैं। ये असंगति समस्याएं पैदा कर सकती हैं।

मेरे प्रमुख ऑपरेटरों के ऊपर ||और &&
इन के संस्करणों में निर्मित शॉर्ट-कट ऑपरेटर हैं। यह अतिभारित संस्करणों के लिए सही नहीं है और इससे कुछ समस्याएं हुई हैं।

तथ्य यह है कि + - * / सभी उसी प्रकार पर लौटते हैं जिस पर वे काम करते हैं (ऑपरेटर पदोन्नति के बाद)
ओवरलोड संस्करण कुछ भी वापस कर सकते हैं (यह वह जगह है जिसमें दुरुपयोग सेट होता है, यदि आपके ऑपरेटर कुछ मध्यस्थ को वापस करना शुरू करते हैं तो उपयोगकर्ता अपेक्षा नहीं कर रहा था चीजें पहाड़ी से नीचे जाती हैं)।


8

ऑपरेटर ओवरलोडिंग ऐसी चीज नहीं है जिसकी आपको वास्तव में बहुत बार "जरूरत" पड़ती है, लेकिन जावा का उपयोग करते समय, यदि आप किसी ऐसे बिंदु से टकराते हैं, जहां आपको इसकी आवश्यकता है, तो यह आपको आपके नाखूनों को चीर देना चाहता है, इसलिए आपके पास टाइपिंग को रोकने का एक बहाना है। ।

वह कोड जो आपने अभी-अभी पाया है, वह बहुत लंबा है? हाँ, आप BigInteger के साथ काम करने के लिए पूरी तरह से फिर से टाइप करने जा रहे हैं। वहाँ और अधिक निराशाजनक कुछ भी नहीं है कि केवल चर के प्रकार को बदलने के लिए पहिया को सुदृढ़ करना।


6

गाय स्टील ने तर्क दिया कि ऑपरेटर ओवरलोडिंग जावा में भी होना चाहिए, अपने मुख्य भाषण में "एक भाषा बढ़ रही है" - इसमें एक वीडियो और इसका एक प्रतिलेखन है, और यह वास्तव में एक अद्भुत भाषण है। आप आश्चर्य करेंगे कि वह पहले दो पृष्ठों के बारे में क्या बात कर रहा है, लेकिन यदि आप पढ़ते रहेंगे, तो आप बिंदु देखेंगे और ज्ञान प्राप्त करेंगे। और यह तथ्य कि वह इस तरह का भाषण कर सकता है, वह भी आश्चर्यजनक है।

इसी समय, इस वार्ता ने बहुत सारे मौलिक शोधों को प्रेरित किया, शायद स्काला सहित - यह उन कागजों में से एक है जिसे हर किसी को क्षेत्र में काम करने के लिए पढ़ना चाहिए।

इस बिंदु पर, उनके उदाहरण ज्यादातर संख्यात्मक वर्गों (जैसे बिगइन्टेगर और कुछ अजीब सामान) के बारे में हैं, लेकिन यह आवश्यक नहीं है।

यह सच है, हालांकि, ऑपरेटर के ओवरलोडिंग के दुरुपयोग से भयानक परिणाम हो सकते हैं, और यह भी कि उचित उपयोग मामलों को जटिल कर सकते हैं, यदि आप पुस्तकालयों का उपयोग किए बिना थोड़ा सा अध्ययन किए बिना कोड को पढ़ने का प्रयास करते हैं। लेकिन क्या यह एक अच्छा विचार है? OTOH, क्या ऐसे पुस्तकालयों को अपने ऑपरेटरों के लिए ऑपरेटर धोखा शीट शामिल करने की कोशिश नहीं करनी चाहिए?


4

मेरा मानना ​​है कि हर कोई इस जवाब से चूक गया। C ++ में आप उन सभी ऑपरेटरों को अधिभारित कर सकते हैं जो आप चाहते हैं, लेकिन आप उस पूर्ववर्तीता को प्रभावित नहीं कर सकते हैं जिसके साथ उनका मूल्यांकन किया जाता है। Scala में यह समस्या नहीं है, IIRC।

जैसा कि यह एक बुरा विचार है, पूर्वगामी मुद्दों के अलावा, लोग ऑपरेटरों के लिए वास्तव में बहुत गलत अर्थ लेकर आते हैं, और यह शायद ही कभी असमर्थता का कारण बनता है। स्काला लाइब्रेरी इस के लिए विशेष रूप से खराब हैं, नासमझ प्रतीक जो आपको हर बार याद रखना चाहिए, पुस्तकालय के रखवालों ने अपने सिर को रेत में चिपकाते हुए कहा, 'आपको केवल इसे एक बार सीखने की जरूरत है'। महान, अब मुझे कुछ 'चतुर' लेखक के गूढ़ वाक्य-विन्यास को सीखने की आवश्यकता है। यह बहुत बुरा नहीं होगा अगर वहाँ ऑपरेटरों के एक साक्षर संस्करण की आपूर्ति ALWAYS का एक सम्मेलन मौजूद था।


1
स्काला ने ऑपरेटर की प्रक्रिया को भी तय कर दिया है, है ना?
स्कफमैन

मेरा मानना ​​है कि वहाँ है, लेकिन यह अभी तक चापलूसी है। इस बिंदु पर, स्काला के पास ऑपरेटरों की अवधि कम है। +, -, * तरीके हैं, ऑपरेटर नहीं, IIRC। यही कारण है कि 2 + 3 * 2, 8 नहीं है, यह 10. है
सेम

7
प्रतीक के पहले चरित्र के आधार पर स्काला की एक पूर्ववर्ती प्रणाली है। scala> 2 + 3 * 2 res0: Int = 8
James Iry

3

ऑपरेटर ओवरलोडिंग एक C ++ आविष्कार नहीं था - यह अल्गोल IIRC से आया था और यहां तक ​​कि गोसलिंग का दावा नहीं है कि यह सामान्य रूप से एक बुरा विचार है।


ज़रूर, लेकिन यह अपने सी ++ अवतार में था कि इसने विवादों की एक सामान्य हवा प्राप्त की।
स्कफमैन

5
"अपरिहार्यता की सामान्य हवा" से आपका क्या मतलब है? अधिकांश लोग जानते हैं कि मैं उन भाषाओं का उपयोग करता हूं जो ऑपरेटर ओवरलोडिंग (C ++, C #) का समर्थन करती हैं और मैंने कभी कोई शिकायत नहीं सुनी।
ट्रिफ़ुनोविक

मैं पूर्व-एएनएसआई सी ++ के साथ अपने लंबे-पुराने अनुभव से बोल रहा हूं, और मैं निश्चित रूप से उनमें से एक सामान्य नापसंद को याद करता हूं। शायद एएनएसआई सी ++ के साथ स्थिति में सुधार हुआ, या लोगों ने सीखा कि कैसे इसका दुरुपयोग न करें।
स्कफमैन

1
किसी ऐसे व्यक्ति के रूप में बोलते हुए, जो C ++ (80 के दशक के मध्य) से C ++ का उपयोग कर रहा है, मैं आपको यह विश्वास दिला सकता हूं कि ISO मानक की शुरुआत से ऑपरेटर ओवरलोडिंग के बारे में लोगों के पूर्वाग्रहों पर कोई प्रभाव नहीं पड़ा।

3

C ++ में गलत ज्ञात एकमात्र चीज एक अलग ऑपरेटर के रूप में [] = ओवरलोड करने की क्षमता की कमी है। यह एक सी ++ कंपाइलर में लागू करने के लिए कठिन हो सकता है जो शायद एक स्पष्ट कारण नहीं है लेकिन इसके लायक है।


2

जैसा कि अन्य उत्तरों ने बताया है; ऑपरेटर ओवरलोडिंग खुद बुरा नहीं है। क्या बुरा है जब इसका उपयोग उन तरीकों से किया जाता है जो परिणामस्वरूप कोड को स्पष्ट नहीं करते हैं। आम तौर पर उनका उपयोग करते समय आपको उन्हें कम से कम आश्चर्यजनक बात करने की आवश्यकता होती है (ऑपरेटर होने पर + विभाजन एक तर्कसंगत वर्ग के उपयोग के लिए परेशानी पैदा करेगा) या जैसा कि स्कॉट मेयर्स कहते हैं:

ग्राहक पहले से ही जानते हैं कि इंट किस तरह का व्यवहार करते हैं, इसलिए आपको अपने प्रकारों को उसी तरह से व्यवहार करने का प्रयास करना चाहिए जब भी उचित हो ... जब संदेह हो, तो इनट्स करें । (प्रभावी C ++ 3 संस्करण संस्करण 18 से)

अब कुछ लोगों ने ऑपरेटर को बढ़ावा देने के लिए अतिआवश्यकता के साथ अतिभारित कर लिया है :: भावना । इस स्तर पर आपको पता नहीं है कि इसे कैसे लागू किया जाता है, लेकिन यह एक दिलचस्प वाक्यविन्यास बनाता है कि आप क्या चाहते हैं। मुझे यकीन नहीं है कि यह अच्छा या बुरा है। यह अच्छा लगता है, लेकिन मैंने इसका इस्तेमाल नहीं किया है।


मैं यहां ओवरलोडिंग करने वाले ऑपरेटर के लिए या उनके खिलाफ बहस नहीं कर रहा हूं, मैं लोगों को उन्हें सही ठहराने के लिए नहीं देख रहा हूं।
स्कफमैन

स्प्रिंट कहीं भी सबसे खराब उदाहरण के आसपास नहीं आया है जो मैं भर में आया हूं - आपको यह देखना चाहिए कि RogueWave डेटाबेस लाइब्रेरी क्या है!

मैं मानता हूं कि आत्मा ऑपरेटरों का दुरुपयोग करती है, लेकिन मैं वास्तव में इसे करने के लिए बेहतर तरीके के बारे में नहीं सोच सकता।
जिफरे

1
मुझे नहीं लगता कि आत्मा ऑपरेटरों को बहुत गाली दे रही है, लेकिन इसे आगे बढ़ा रही है। मैं मानता हूं कि वास्तव में ऐसा करने का कोई अन्य तरीका नहीं है। यह मूल रूप से C ++ के सिंटैक्स के भीतर एक DSL बनाता है। C ++ को करने के लिए डिज़ाइन किया गया था। हां, इससे भी बदतर उदाहरण हैं :) सामान्य तौर पर मैं उनका उपयोग करता हूं जहां उपयुक्त है। ज्यादातर बस आसान डिबगिंग \ लॉगिंग के लिए स्ट्रीमिंग ऑपरेटरों। और यहां तक ​​कि यह सिर्फ चीनी है कि कक्षा में लागू एक विधि के लिए आगे है।
मैट प्राइस

1
यह एक स्वाद का सवाल है; लेकिन पार्सर कॉम्बिनेटर लाइब्रेरी, कार्यात्मक भाषाओं में, एक तरह से ओवरलोड ऑपरेटरों को आत्मा के समान है, और कोई भी इसके खिलाफ तर्क नहीं देता है। बहुत सारे तकनीकी कारण हैं जिनके लिए वे बेहतर हैं - Google "एम्बेडेड डोमेन विशिष्ट भाषाओं" के लिए बहुत सारे कागजात यह समझाता है कि सामान्य दृष्टिकोण से, और Google इस मामले में व्यावहारिक उदाहरणों के लिए "स्काला पार्सर कॉम्बीनेटर" के लिए। यह सच है कि कार्यात्मक भाषाओं में परिणामी वाक्यविन्यास अक्सर अच्छे होते हैं - उदाहरण के लिए, आपको समवर्ती पार्सर के लिए >> का अर्थ बदलने की आवश्यकता नहीं है।
Blaisorblade

2

मैंने कभी यह दावा करते हुए कोई लेख नहीं देखा कि C ++ का ऑपरेटर ओवरलोडिंग खराब है।

उपयोगकर्ता-निश्चित ऑपरेटर भाषा के उपयोगकर्ताओं के लिए आसान उच्च स्तरीय अभिव्यक्ति और उपयोगिता की अनुमति देते हैं।


1

हालाँकि, यह C ++ में ओवरलोडिंग करने वाले ऑपरेटर के लिए गुणात्मक रूप से भिन्न नहीं होगा, जहां मुझे याद है कि ऑपरेटरों को विशेष कार्यों के रूप में परिभाषित किया गया है।

AFAIK, "सामान्य" सदस्य कार्यों की तुलना में ऑपरेटर कार्यों में कुछ खास नहीं है। बेशक, आपके पास केवल कुछ निश्चित ऑपरेटर होते हैं जिन्हें आप ओवरलोड कर सकते हैं, लेकिन यह उन्हें बहुत खास नहीं बनाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.