ऑपरेटर ओवरलोडिंग: Difference between revisions

From Vigyanwiki
No edit summary
 
(7 intermediate revisions by 4 users not shown)
Line 2: Line 2:


{{Polymorphism}}
{{Polymorphism}}
[[कंप्यूटर प्रोग्रामिंग]] में, '''संक्रियक ओवरलोडिंग''', जिसे कभी-कभी ''संक्रियक [[तदर्थ बहुरूपता]]'' कहा जाता है, [[बहुरूपता (कंप्यूटर विज्ञान)]] का एक विशिष्ट स्थिति होती है, जहां विभिन्न [[ऑपरेटर (कंप्यूटर प्रोग्रामिंग)|संचालक]] के तर्कों के आधार पर अलग-अलग कार्यान्वयन होते हैं। संक्रियक ओवरलोडिंग को सामान्यतः एक [[प्रोग्रामिंग भाषा]], एक [[प्रोग्रामर]] या दोनों के द्वारा परिभाषित किया जाता है।
[[कंप्यूटर प्रोग्रामिंग]] में, '''ऑपरेटर ओवरलोडिंग''', जिसे कभी-कभी ''ऑपरेटर [[तदर्थ बहुरूपता]]'' कहा जाता है, [[बहुरूपता (कंप्यूटर विज्ञान)]] का एक विशिष्ट स्थिति होती है, जहां विभिन्न [[ऑपरेटर (कंप्यूटर प्रोग्रामिंग)|ऑपरेटर]] के तर्कों के आधार पर अलग-अलग कार्यान्वयन करते हैं। ऑपरेटर ओवरलोडिंग को सामान्यतः एक [[प्रोग्रामिंग भाषा]], एक [[प्रोग्रामर]] या दोनों के द्वारा परिभाषित किया जाता है।


==मूल कारण ==
==मूल कारण ==
संक्रियक ओवरलोडिंग [[वाक्यात्मक शर्करा]] होती है, और इसका उपयोग इसलिए किया जाता है क्योंकि डोमेन के निकट संकेतन का उपयोग करके प्रोग्रामिंग की अनुमति देता है<ref>{{cite web |website=C++ FAQ |title=ऑपरेटर ओवरलोडिंग|url=https://isocpp.org/wiki/faq/operator-overloading#op-ov-benefits |last=Stroustrup |first=Bjarne |author-link=Bjarne Stroustrup |access-date=27 August 2020 |archive-url=https://web.archive.org/web/20110814105309/http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.2 |archive-date=14 August 2011}}</ref> और उपयोगकर्ता-परिभाषित प्रकारों को भाषा में निर्मित प्रकारों के समान वाक्य-विन्यास समर्थन की अनुमति देता है। यह सामान्य है, उदाहरण के लिए, वैज्ञानिक कंप्यूटिंग में, जहां यह गणितीय वस्तुओं के कंप्यूटिंग अभ्यावेदन को कागज पर समान वाक्यविन्यास के साथ प्रकलित चर की अनुमति देता है।
ऑपरेटर ओवरलोडिंग [[वाक्यात्मक शर्करा]] होती है, और इसका उपयोग इसलिए किया जाता है क्योंकि डोमेन के निकट संकेतन का उपयोग करके प्रोग्रामिंग की अनुमति देता है<ref>{{cite web |website=C++ FAQ |title=ऑपरेटर ओवरलोडिंग|url=https://isocpp.org/wiki/faq/operator-overloading#op-ov-benefits |last=Stroustrup |first=Bjarne |author-link=Bjarne Stroustrup |access-date=27 August 2020 |archive-url=https://web.archive.org/web/20110814105309/http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.2 |archive-date=14 August 2011}}</ref> और उपयोगकर्ता-परिभाषित प्रकारों को भाषा में निर्मित प्रकारों के समान वाक्य-विन्यास पुष्टि की अनुमति देता है। यह सामान्य है, उदाहरण के लिए, वैज्ञानिक कंप्यूटिंग में, जहां यह गणितीय वस्तुओं के कंप्यूटिंग अभ्यावेदन को कागज पर समान सिन्टैक्स के साथ प्रकलित चर की अनुमति देता है।


संक्रियक ओवरलोडिंग किसी भाषा की [[अभिव्यंजक शक्ति (कंप्यूटर विज्ञान)|अभिव्यंजक क्षमता]] (फलनों के साथ) को नहीं बदलती है, क्योंकि इसे फलन कॉल का उपयोग करके अनुकरण किया जा सकता है। उदाहरण के लिए, चर पर विचार करें {{code|a}}, {{code|b}} और {{code|c}} कुछ उपयोगकर्ता-परिभाषित प्रकार, जैसे [[मैट्रिक्स (गणित)|आव्यूह]]:
ऑपरेटर ओवरलोडिंग किसी भाषा की [[अभिव्यंजक शक्ति (कंप्यूटर विज्ञान)|सूचक क्षमता]] (फलनों के साथ) को नहीं बदलती है, क्योंकि इसे फलन कॉल का उपयोग करके अनुकरण किया जा सकता है। उदाहरण के लिए, चर पर विचार करें {{code|a}}, {{code|b}} और {{code|c}} कुछ उपयोगकर्ता-परिभाषित प्रकार, जैसे [[मैट्रिक्स (गणित)|आव्यूह]]:


{{code|a + b * c}}
{{code|a + b * c}}


ऐसी भाषा में जो संक्रियक ओवरलोडिंग का समर्थन करती है, और सामान्य धारणा के साथ कि '*' संक्रियक संचालन का क्रम '+' संक्रियक की तुलना में अधिक है, यह लिखने का एक संक्षिप्त विधि है:
ऐसी भाषा में जो ऑपरेटर ओवरलोडिंग का पुष्टि करती है, और सामान्य धारणा के साथ कि '*' ऑपरेटर की प्राथमिकता का क्रम '+' ऑपरेटर की तुलना में अधिक है, यह लिखने का एक संक्षिप्त विधि होती है:


{{code|Add(a, Multiply(b, c))}}
{{code|Add(a, Multiply(b, c))}}


चूँकि , पूर्व वाक्यविन्यास सामान्य गणितीय उपयोग को दर्शाता है।
चूँकि , पूर्व सिन्टैक्स सामान्य गणितीय उपयोग को दर्शाता है।


==उदाहरण==
==उदाहरण==
इस स्थिति में, अतिरिक्त संक्रियक को C++ में उपयोगकर्ता-परिभाषित प्रकार समय पर जोड़ने की अनुमति देने के लिए {{code|Time}}अतिभारित किया गया है:
इस स्थिति में, परिवर्धन ऑपरेटर को C++ में उपयोगकर्ता-परिभाषित प्रकार {{code|Time}}पर जोड़ने की अनुमति देने के लिए अतिभारित किया गया है:


<syntaxhighlight lang=Cpp>
<syntaxhighlight lang=Cpp>
Line 33: Line 33:
}
}
</syntaxhighlight>
</syntaxhighlight>
जोड़ एक [[बाइनरी ऑपरेशन]] है, जिसका अर्थ है कि इसमें दो [[ ओपेरंड |ओपेरंड]] हैं। C++ में, पारित किए जा रहे तर्क ऑपरेंड हैं, और {{code|temp}}ऑब्जेक्ट लौटाया गया मान है।
संकलन एक [[बाइनरी ऑपरेशन]] है, जिसका अर्थ है कि इसमें दो [[ ओपेरंड |ओपेरंड]] होते हैं। C++ में, पारित किए जा रहे तर्क ऑपरेंड हैं, और {{code|temp}}ऑब्जेक्ट प्रतिगमित मान होते है।


ऑपरेशन को प्रतिस्थापित करते हुए एक क्लास विधि के रूप में भी परिभाषित किया जा सकता है {{code|lhs}}छिपे हुए द्वारा {{code|this}} तर्क; चूँकि , यह बाएँ ऑपरेंड को प्रकार का होने के लिए बाध्य करता है {{code|Time}}:
ऑपरेशन को प्रतिस्थापित करते हुए एक क्लास विधि के रूप में भी परिभाषित किया जा सकता है {{code|lhs}}छिपे हुए द्वारा {{code|this}} तर्क; चूँकि, यह बाएँ ऑपरेंड को {{code|Time}} पर होने के लिए बाध्य करता है:


<syntaxhighlight lang=Cpp>
<syntaxhighlight lang=Cpp>
Line 51: Line 51:
}
}
</syntaxhighlight>
</syntaxhighlight>
ध्यान दें कि क्लास विधि के रूप में परिभाषित [[यूनरी ऑपरेशन|यूनरी]] संक्रियक को कोई स्पष्ट तर्क नहीं मिलेगा ({{code|this}} केवल इससे काम करता है):
ध्यान दें कि क्लास विधि के रूप में परिभाषित [[यूनरी ऑपरेशन|यूनरी]] ऑपरेटर को कोई स्पष्ट तर्क नहीं मिलेगा ({{code|this}} केवल इससे काम करता है):


<syntaxhighlight lang=Cpp>
<syntaxhighlight lang=Cpp>
Line 58: Line 58:
}
}
</syntaxhighlight>
</syntaxhighlight>
किसी संरचना या वर्ग को सॉर्ट करने के लिए कम-से-कम (<) संक्रियक को अधिकांशतः अतिभारित किया जाता है:
किसी संरचना या वर्ग को सॉर्ट करने के लिए कम-से-कम (<) ऑपरेटर को अधिकांशतः अतिभारित किया जाता है:


<syntaxhighlight lang=Cpp>
<syntaxhighlight lang=Cpp>
Line 75: Line 75:
};
};
</syntaxhighlight>
</syntaxhighlight>
पिछले उदाहरणों की तरह, अंतिम उदाहरण में संक्रियक ओवरलोडिंग कक्षा के भीतर किया जाता है। C++ में, कम-से-कम संचालक (<) को ओवरलोड करने के बाद,कुछ कक्षाओं को सॉर्ट करने के लिए मानक सॉर्टिंग फलन (C++) का उपयोग किया जा सकता है।
पिछले उदाहरणों की तरह, अंतिम उदाहरण में ऑपरेटर ओवरलोडिंग कक्षा के भीतर किया जाता है। C++ में, कम-से-कम ऑपरेटर (<) को ओवरलोड करने के बाद,कुछ कक्षाओं को सॉर्ट करने के लिए मानक सॉर्टिंग फलन (C++) का उपयोग किया जा सकता है।


==आलोचना==
==आलोचना==
संक्रियक द्वारा ओवरलोडिंग की अधिकांशतः आलोचना की जाती रही है<ref>{{cite web |url=http://pages.cs.wisc.edu/~fischer/cs538.s08/lectures/Lecture08.4up.pdf |title=ओवरलोडिंग में समस्याएँ|last=Fisher |first=Charles N. |publisher=[[University of Wisconsin–Madison]] |year=2008}}</ref> क्योंकि यह प्रोग्रामर को उनके ऑपरेंड के आधार पर संचालकों के शब्दार्थ को पुन:  पुन: सौंपने की अनुमति देता है। उदाहरण के लिए, {{code|<<}} C++ संक्रियक का उपयोग <syntaxhighlight lang=Cpp inline>a << b</syntaxhighlight> यदि {{code|a}} और{{code|b}} एक पूर्णांक प्रकार के हैं तो वेरिएबल {{code|a}} में बिट्स को {{code|b}} बिट्स द्वारा बाईं ओर स्थानांतरित कर देता है, किन्तु यदि {{code|a}} एक आउटपुट स्ट्रीम हैतो उपरोक्त कोड स्ट्रीम में {{code|a}} {{code|b}} लिखने का प्रयास करेगा। क्योंकि संक्रियक ओवरलोडिंग मूल प्रोग्रामर को संक्रियक के सामान्य शब्दार्थ को बदलने और किसी भी आगामी प्रोग्रामर को आश्चर्यचकित करने की अनुमति देता है, इसलिए संक्रियक ओवरलोडिंग का सावधानी से उपयोग करना अच्छा अभ्यास माना जाता है(जावा के रचनाकारों ने इस सुविधा का उपयोग न करने का निर्णय लिया,<ref>{{cite web |url=http://www.oracle.com/technetwork/java/simple-142616.html#4098 |website=The Java Language Environment |title=अब ऑपरेटर ओवरलोडिंग नहीं करेगा|publisher=[[Oracle Corporation]]}}</ref> चूँकि जरूरी नहीं कि इसी कारण से होता है )।
ऑपरेटर द्वारा ओवरलोडिंग की अधिकांशतः आलोचना की जाती रही है<ref>{{cite web |url=http://pages.cs.wisc.edu/~fischer/cs538.s08/lectures/Lecture08.4up.pdf |title=ओवरलोडिंग में समस्याएँ|last=Fisher |first=Charles N. |publisher=[[University of Wisconsin–Madison]] |year=2008}}</ref> क्योंकि यह प्रोग्रामर को उनके ऑपरेंड के आधार पर ऑपरेटरों के शब्दार्थ को पुन:सौंपने की अनुमति देता है। उदाहरण के लिए, {{code|<<}} C++ ऑपरेटर का उपयोग <syntaxhighlight lang=Cpp inline>a << b</syntaxhighlight> यदि {{code|a}} और{{code|b}} एक पूर्णांक प्रकार के हैं तो वेरिएबल {{code|a}} में बिट्स को {{code|b}} बिट्स द्वारा बाईं ओर स्थानांतरित कर देता है, किन्तु यदि {{code|a}}एक आउटपुट स्ट्रीम हैतो उपरोक्त कोड स्ट्रीम में {{code|a}} {{code|b}} लिखने का प्रयास करेगा। क्योंकि ऑपरेटर ओवरलोडिंग मूल प्रोग्रामर को ऑपरेटर के सामान्य शब्दार्थ को बदलने और किसी भी आगामी प्रोग्रामर को आश्चर्यचकित करने की अनुमति देता है, इसलिए ऑपरेटर ओवरलोडिंग का सावधानी से उपयोग करना अच्छा अभ्यास माना जाता है(जावा के रचनाकारों ने इस सुविधा का उपयोग न करने का निर्णय लिया,<ref>{{cite web |url=http://www.oracle.com/technetwork/java/simple-142616.html#4098 |website=The Java Language Environment |title=अब ऑपरेटर ओवरलोडिंग नहीं करेगा|publisher=[[Oracle Corporation]]}}</ref> चूँकि जरूरी नहीं कि इसी कारण से होता है )।


संक्रियकों के साथ एक और अधिक सूक्ष्म मुद्दा यह है कि गणित के कुछ नियमों की गलत विधि से अपेक्षा की जा सकती है या अनजाने में मान ली जा सकती है।उदाहरण के लिए, + क्रमविनिमेयता (अर्थात वह {{code|1=a + b == b + a}}) सदैव लागू नहीं होती ; इसका एक उदाहरण तब होता है जब ऑपरेंड स्ट्रिंग होते हैं, क्योंकि सामान्यतः स्ट्रिंग्स का संयोजन करने के लिए + को अतिभारित किया जाता है (अर्थात {{code|"bird" + "song"}} से {{code|"birdsong"}}, प्राप्त होता है, जबकि {{code|"song" + "bird"}} से {{code|"songbird"}}) प्राप्त होता है)। इस तर्क का एक विशिष्ट प्रतिवाद सीधे गणित से आता है:{{citation needed|date=September 2013}} जबकि + पूर्णांकों (और सामान्यतः किसी भी जटिल संख्या) पर क्रमविनिमेय है, यह चर के अन्य "प्रकार" के लिए क्रमविनिमेय नहीं होता है।व्यवहार में, + सदैव सहयोगी नहीं होता है,उदाहरण के लिए राउंडिंग त्रुटियों के कारण फ़्लोटिंग-पॉइंट मानों के साथ। एक अन्य उदाहरण: गणित में, गुणन वास्तविक और जटिल संख्याओं के लिए क्रमविनिमेय है किन्तु [[मैट्रिक्स गुणन|आव्यूह गुणन]] में क्रमविनिमेय नहीं होते है।
ऑपरेटरों के साथ एक और अधिक सूक्ष्म मुद्दा यह है कि गणित के कुछ नियमों की गलत विधि से अपेक्षा की जा सकती है या अनजाने में मान ली जा सकती है।उदाहरण के लिए, + क्रमविनिमेयता (अर्थात वह {{code|1=a + b == b + a}}) सदैव लागू नहीं होती ; इसका एक उदाहरण तब होता है जब ऑपरेंड स्ट्रिंग होते हैं, क्योंकि सामान्यतः स्ट्रिंग्स का संयोजन करने के लिए + को अतिभारित किया जाता है (अर्थात {{code|"bird" + "song"}} से {{code|"birdsong"}}, प्राप्त होता है, जबकि {{code|"song" + "bird"}} से {{code|"songbird"}}) प्राप्त होता है)। इस तर्क का एक विशिष्ट प्रतिवाद सीधे गणित से आता है:{{citation needed|date=September 2013}} जबकि + पूर्णांकों (और सामान्यतः किसी भी जटिल संख्या) पर क्रमविनिमेय है, यह चर के अन्य "प्रकार" के लिए क्रमविनिमेय नहीं होता है।व्यवहार में, + सदैव सहयोगी नहीं होता है,उदाहरण के लिए राउंडिंग त्रुटियों के कारण फ़्लोटिंग-पॉइंट मानों के साथ। एक अन्य उदाहरण: गणित में, गुणन वास्तविक और जटिल संख्याओं के लिए क्रमविनिमेय है किन्तु [[मैट्रिक्स गुणन|आव्यूह गुणन]] में क्रमविनिमेय नहीं होते है।


==कैटलॉग==
==सूचीपत्र==
कुछ सामान्य प्रोग्रामिंग भाषाओं का वर्गीकरण इस आधार पर किया जाता है कि क्या उनके संक्रियक प्रोग्रामर द्वारा अतिभारित हैं और क्या संक्रियक पूर्वनिर्धारित सेट तक सीमित होते हैं।
कुछ सामान्य प्रोग्रामिंग भाषाओं का वर्गीकरण इस आधार पर किया जाता है कि क्या उनके ऑपरेटर प्रोग्रामर द्वारा अतिभारित हैं और क्या ऑपरेटर पूर्वनिर्धारित तक सीमित होते हैं।


{| class="wikitable"
{| class="wikitable"
|-
|-
! संचालकों
! ऑपरेटरों
! अतिभारित नहीं
! अतिभारित नहीं
! अतिभारित
! अतिभारित
Line 138: Line 138:
*[[MATLAB]]<ref>{{cite web |title=Implementing Operators for Your Class |url=http://www.mathworks.com/help/matlab/matlab_oop/implementing-operators-for-your-class.html |access-date=1 October 2013}}</ref>
*[[MATLAB]]<ref>{{cite web |title=Implementing Operators for Your Class |url=http://www.mathworks.com/help/matlab/matlab_oop/implementing-operators-for-your-class.html |access-date=1 October 2013}}</ref>
*[[Object Pascal]] ([[Free Pascal]],<ref>{{cite web |title=Operator Overloading |website=Free Pascal Manual |url=http://www.freepascal.org/docs-html/ref/refch15.html |access-date=1 December 2014}}</ref> [[Delphi (programming language)|Delphi]] (2005 के बाद से )<ref>{{cite web |title=Operator Overloading |website=Delphi Manual |url=http://docwiki.embarcadero.com/RADStudio/XE4/en/Operator_Overloading_%28Delphi%29 |access-date=1 December 2014}}</ref>)
*[[Object Pascal]] ([[Free Pascal]],<ref>{{cite web |title=Operator Overloading |website=Free Pascal Manual |url=http://www.freepascal.org/docs-html/ref/refch15.html |access-date=1 December 2014}}</ref> [[Delphi (programming language)|Delphi]] (2005 के बाद से )<ref>{{cite web |title=Operator Overloading |website=Delphi Manual |url=http://docwiki.embarcadero.com/RADStudio/XE4/en/Operator_Overloading_%28Delphi%29 |access-date=1 December 2014}}</ref>)
*[[PHP]] (मैजिक विधियों का उपयोग करना,<ref>{{cite web |title=PHP magic methods overriding class properties |url=http://webwidetutor.com/php/php-oop-Magic-Methods-tutorial-?id=30 |access-date=7 April 2015 |archive-url=https://web.archive.org/web/20160304050243/http://webwidetutor.com/php/php-oop-Magic-Methods-tutorial-?id=30 |archive-date=4 March 2016}}</ref> ऐरेएक्सेस इंटरफ़ेस, या संक्रियक एक्सटेंशन)
*[[PHP]] (मैजिक विधियों का उपयोग करना,<ref>{{cite web |title=PHP magic methods overriding class properties |url=http://webwidetutor.com/php/php-oop-Magic-Methods-tutorial-?id=30 |access-date=7 April 2015 |archive-url=https://web.archive.org/web/20160304050243/http://webwidetutor.com/php/php-oop-Magic-Methods-tutorial-?id=30 |archive-date=4 March 2016}}</ref> ऐरेएक्सेस इंटरफ़ेस, या ऑपरेटर एक्सटेंशन)
*[[Perl]]<ref name="Orwant2002">{{cite book |last=Orwant |first=Jon |title=Computer Science & Perl Programming: Best of The Perl Journal |url=https://books.google.com/books?id=8TkEOyBHoOoC&q=%22operator+overloading%22&pg=PA347 |date=4 November 2002 |publisher=O'Reilly Media, Inc. |isbn=978-0-596-00310-4 |pages=347–}}</ref>
*[[Perl]]<ref name="Orwant2002">{{cite book |last=Orwant |first=Jon |title=Computer Science & Perl Programming: Best of The Perl Journal |url=https://books.google.com/books?id=8TkEOyBHoOoC&q=%22operator+overloading%22&pg=PA347 |date=4 November 2002 |publisher=O'Reilly Media, Inc. |isbn=978-0-596-00310-4 |pages=347–}}</ref>
*[[Python (programming language)|Python]]<ref>{{cite web |url=https://docs.python.org/3/reference/datamodel.html |website=The Python Language Reference |title=3. Data Model}}</ref>
*[[Python (programming language)|Python]]<ref>{{cite web |url=https://docs.python.org/3/reference/datamodel.html |website=The Python Language Reference |title=3. Data Model}}</ref>
Line 146: Line 146:
|}
|}


==संक्रियक ओवरलोडिंग की समयरेखा==
==ऑपरेटर ओवरलोडिंग की समयरेखा==


===1960===
===1960===
[[ALGOL 68]] विनिर्देशन ने संचालक को ओवरलोडिंग की अनुमति दी।<ref>{{cite web |title=Report on the Algorithmic Language ALGOL 68, Section 10.2.2. |url=https://www.softwarepreservation.org/projects/ALGOL/report/Algol68_revised_report-AB-600dpi.pdf =Barry J. Mailloux |last3=Peck |first3=John E. L. |author-link3=John E. L. Peck |last4=Koster |first4= Cornelis H. A. |author-link4=Cornelis H.A. Koster |access-date=1 April 2007 |date=August 1968  |display-authors=etal}}</ref>
[[ALGOL 68]] विनिर्देशन ने ऑपरेटर को ओवरलोडिंग की अनुमति दी।<ref>{{cite web |title=Report on the Algorithmic Language ALGOL 68, Section 10.2.2. |url=https://www.softwarepreservation.org/projects/ALGOL/report/Algol68_revised_report-AB-600dpi.pdf =Barry J. Mailloux |last3=Peck |first3=John E. L. |author-link3=John E. L. Peck |last4=Koster |first4= Cornelis H. A. |author-link4=Cornelis H.A. Koster |access-date=1 April 2007 |date=August 1968  |display-authors=etal}}</ref>


ALGOL 68 भाषा विनिर्देश (पृष्ठ 177) से उद्धरण जहां अतिभारित संक्रियकों ¬, =, ≠, और abs को परिभाषित किया गया है:
ALGOL 68 भाषा विनिर्देश (पृष्ठ 177) से उद्धरण जहां अतिभारित ऑपरेटरों ¬, =, ≠, और abs को परिभाषित किया गया है:


  10.2.2. Operations on Boolean Operands
  10.2.2. Operations on Boolean Operands
Line 161: Line 161:
  f) '''op''' '''abs''' = ('''bool''' a)'''int''': ( a | 1 | 0 );
  f) '''op''' '''abs''' = ('''bool''' a)'''int''': ( a | 1 | 0 );


ध्यान दें कि किसी संक्रियक को ''ओवरलोड'' करने के लिए किसी विशेष घोषणा की आवश्यकता नहीं है, और प्रोग्रामर नए संक्रियक बनाने के लिए स्वतंत्र होता है। डायडिक संक्रियकों के लिए अन्य संक्रियकों की तुलना में उनकी प्राथमिकता निर्धारित की जा सकती है :
ध्यान दें कि किसी ऑपरेटर को ओवरलोड करने के लिए किसी विशेष घोषणा की आवश्यकता नहीं होती है, और प्रोग्रामर मे नए ऑपरेटर बनाने के लिए स्वतंत्र होता है। डायडिक ऑपरेटरों के लिए अन्य ऑपरेटरों की तुलना में उनकी प्राथमिकता निर्धारित की जा सकती है :


   '''prio''' '''max''' = 9;
   '''prio''' '''max''' = 9;
Line 169: Line 169:


===1980===
===1980===
Ada 83 भाषा मानक के प्रकाशन के साथ, Ada अपनी स्थापना से ही संक्रियकों की ओवरलोडिंग का समर्थन करता है। चूँकि, भाषा डिजाइनरों ने नए संक्रियकों की परिभाषा को रोकने का फैसला किया। "+", "*", "&" आदि जैसे पहचानकर्ताओं के साथ नए फलनों को परिभाषित करके, भाषा में केवल सम्मलित संचालकों को ओवरलोड किया जा सकता है। भाषा के बाद के संशोधनों (1995 और 2005 में) ने मौजूदा संक्रियकों की ओवरलोडिंग पर प्रतिबंध बनाए रखते हैं।
Ada 83 भाषा मानक के प्रकाशन के साथ, Ada अपनी स्थापना से ही ऑपरेटरों की ओवरलोडिंग का पुष्टि करता है। चूँकि, भाषा डिजाइनरों ने नए ऑपरेटरों की परिभाषा को रोकने का फैसला किया। "+", "*", "&" आदि जैसे पहचानकर्ताओं के साथ नए फलनों को परिभाषित करके, भाषा में केवल सम्मलित ऑपरेटरों को ओवरलोड किया जा सकता है। भाषा के बाद के संशोधनों (1995 और 2005 में) ने मौजूदा ऑपरेटरों की ओवरलोडिंग पर प्रतिबंध बनाए रखते हैं।


C++ में, संक्रियक ओवरलोडिंग ALGOL 68 की तुलना में अधिक होते परिष्कृत है।<ref>{{cite web |title=A History of C++: 1979−1991 |url=http://www.stroustrup.com/hopl2.pdf |last=Stroustrup |first=Bjarne |author-link=Bjarne Stroustrup |page=12 |access-date=1 April 2007}}</ref>
C++ में, ऑपरेटर ओवरलोडिंग ALGOL 68 की तुलना में अधिक होते परिष्कृत है।<ref>{{cite web |title=A History of C++: 1979−1991 |url=http://www.stroustrup.com/hopl2.pdf |last=Stroustrup |first=Bjarne |author-link=Bjarne Stroustrup |page=12 |access-date=1 April 2007}}</ref>
===1990 का दशक===
===1990 का दशक===
[[सन माइक्रोसिस्टम्स]] में जावा (प्रोग्रामिंग भाषा) भाषा डिजाइनरों ने ओवरलोडिंग को छोड़ने का फैसला किया।<ref>{{cite web |url=http://www.cafeaulait.org/javafaq.html#xtocid1902938 |website=The comp.lang.java FAQ List |title=FAQ Question 6.9: Why isn't there operator overloading?}}</ref><ref>{{cite web |url=http://java.sun.com/docs/white/langenv/Simple.doc2.html |title=जावा.सुन.कॉम|url-status=dead |access-date=26 March 2009 |archive-date=7 March 2009 |archive-url=https://web.archive.org/web/20090307035128/http://java.sun.com/docs/white/langenv/Simple.doc2.html }}</ref><ref>{{cite book |last=Holzner |first=Steven |title=C++: Black Book |year=2001 |publisher=Coriolis Group |location=Scottsdale, Arizona |isbn=1-57610-777-9 |page=387 |quote=One of the nicest features of C++ OOP is that you can overload operators to handle objects of your classes (you can't do this in some other OOP-centric languages, like Java).}}</ref>
[[सन माइक्रोसिस्टम्स]] में जावा भाषा डिजाइनरों ने ओवरलोडिंग को छोड़ने का फैसला किया।<ref>{{cite web |url=http://www.cafeaulait.org/javafaq.html#xtocid1902938 |website=The comp.lang.java FAQ List |title=FAQ Question 6.9: Why isn't there operator overloading?}}</ref><ref>{{cite web |url=http://java.sun.com/docs/white/langenv/Simple.doc2.html |title=जावा.सुन.कॉम|url-status=dead |access-date=26 March 2009 |archive-date=7 March 2009 |archive-url=https://web.archive.org/web/20090307035128/http://java.sun.com/docs/white/langenv/Simple.doc2.html }}</ref><ref>{{cite book |last=Holzner |first=Steven |title=C++: Black Book |year=2001 |publisher=Coriolis Group |location=Scottsdale, Arizona |isbn=1-57610-777-9 |page=387 |quote=One of the nicest features of C++ OOP is that you can overload operators to handle objects of your classes (you can't do this in some other OOP-centric languages, like Java).}}</ref>


[[पायथन (प्रोग्रामिंग भाषा)|पायथन]] विशेष नामों के साथ विधियों के कार्यान्वयन के माध्यम से संक्रियक को ओवरलोडिंग की अनुमति देता है।<ref>{{cite web |url=https://docs.python.org/3/reference/datamodel.html#specialnames |website=The Python Language Reference |title=3. Data Model, Special method names}}</ref> उदाहरण के लिए, अतिरिक्त (+) संक्रियक को {{code|obj.__add__(self, other)}} विधि लागू करके ओवरलोड किया जा सकता है।
[[पायथन (प्रोग्रामिंग भाषा)|पायथन]] विशेष नामों के साथ विधियों के कार्यान्वयन के माध्यम से ऑपरेटर को ओवरलोडिंग की अनुमति देता है।<ref>{{cite web |url=https://docs.python.org/3/reference/datamodel.html#specialnames |website=The Python Language Reference |title=3. Data Model, Special method names}}</ref> उदाहरण के लिए, अतिरिक्त (+) ऑपरेटर को {{code|obj.__add__(self, other)}} विधि लागू करके ओवरलोड किया जा सकता है।


[[रूबी (प्रोग्रामिंग भाषा)]] सरल विधि कॉल के लिए संक्रियक को सिंटैक्टिक शुगर के रूप में ओवरलोडिंग की अनुमति देती है।
[[रूबी (प्रोग्रामिंग भाषा)|रूबी]] सरल विधि कॉल के लिए ऑपरेटर को सिंटैक्टिक शुगर के रूप में ओवरलोडिंग की अनुमति देती है।


[[लुआ (प्रोग्रामिंग भाषा)]] संक्रियक को अतिरिक्त सुविधा के साथ विधि कॉल के लिए सिंटैक्टिक शुगर के रूप में ओवरलोडिंग की अनुमति देता है कि यदि पहला ऑपरेंड उस संक्रियक को परिभाषित नहीं करता है, तो दूसरे ऑपरेंड के लिए विधि का उपयोग किया जाएगा।
[[लुआ (प्रोग्रामिंग भाषा)|लुआ]] ऑपरेटर को अतिरिक्त सुविधा के साथ विधि कॉल के लिए सिंटैक्टिक शुगर के रूप में ओवरलोडिंग की अनुमति देता है कि यदि पहला ऑपरेंड उस ऑपरेटर को परिभाषित नहीं करता है, तो दूसरे ऑपरेंड के लिए विधि का उपयोग किया जाएगा।


===2000===
===2000===
माइक्रोसॉफ्ट ने 2001 में C# और 2003 में विजुअल बेसिक .NET में संक्रियक ओवरलोडिंग युग्मित किया था।
माइक्रोसॉफ्ट ने 2001 में C# और 2003 में विजुअल बेसिक .NET में ऑपरेटर ओवरलोडिंग युग्मित किया था।


[[स्काला (प्रोग्रामिंग भाषा)]] सभी संक्रियकों को विधियों के रूप में मानता है और इस प्रकार संक्रियक को प्रॉक्सी द्वारा ओवरलोडिंग की अनुमति देता है।
[[स्काला (प्रोग्रामिंग भाषा)]] सभी ऑपरेटरों को विधियों के रूप में मानता है और इस प्रकार ऑपरेटर को प्रॉक्सी द्वारा ओवरलोडिंग की अनुमति देता है।


[[राकू (प्रोग्रामिंग भाषा)|राकू]] में, सभी संचालक की परिभाषा को शाब्दिक फलनों को सौंपा गया है, और इसलिए, फलन परिभाषाओं का उपयोग करके, संक्रियकों को ओवरलोड किया जा सकता है या नए संचालक जोड़े जा सकते हैं। उदाहरण के लिए, दिनांक ऑब्जेक्ट को "+" के साथ बढ़ाने के लिए रकुडो स्रोत में परिभाषित फलन होता है:
[[राकू (प्रोग्रामिंग भाषा)|राकू]] में, सभी ऑपरेटर परिभाषा को शाब्दिक फलनों को सौंपा गया है, और इसलिए, फलन परिभाषाओं का उपयोग करके, ऑपरेटरों को ओवरलोड किया जा सकता है या नए ऑपरेटर युग्मित किए जा सकते हैं। उदाहरण के लिए, दिनांक वस्तु को "+" के साथ बढ़ाने के लिए रकुडो स्रोत में परिभाषित फलन होता है:
   multi infix:<+>(Date:D $d, Int:D $x) {
   multi infix:<+>(Date:D $d, Int:D $x) {


Line 193: Line 193:




चूँकि "बहु" का उपयोग किया गया था, फलन [[मल्टीडिस्पैच]] उम्मीदवारों की सूची में जुड़ जाता है, और  "+" केवल उस स्थिति के लिए अतिभारित है जहां फलन चिहनक में प्रकार की व्यवरोध पूरी होती हैं। जबकि ओवरलोडिंग की क्षमता में +, *, >=, पोस्टफिक्स और टर्म i इकाई इत्यादि सम्मलित होती हैं, यह विभिन्न ब्रेस संक्रियकों को ओवरलोड करने की भी अनुमति देता है: "'''['''x, y''']'''", "x'''[''' y ''']'''", "x'''{''' y '''}'''", and "x'''(''' y ''')'''"


[[कोटलिन (प्रोग्रामिंग भाषा)]] ने अपने निर्मिति के बाद से ही संक्रियक ओवरलोडिंग का समर्थन किया है।
चूँकि "बहु" का उपयोग किया गया था, फलन [[मल्टीडिस्पैच]] उम्मीदवारों की सूची में जुड़ जाता है, और "+" केवल उस स्थिति के लिए अतिभारित है जहां फलन चिहनक में प्रकार की व्यवरोध पूरी होती हैं। जबकि ओवरलोडिंग की क्षमता में +, *, >=, पोस्टफिक्स और टर्म i इकाई इत्यादि सम्मलित होती हैं, यह विभिन्न ब्रेस ऑपरेटरों को ओवरलोड करने की भी अनुमति देता है: "'''['''x, y''']'''", "x'''[''' y ''']'''", "x'''{''' y '''}'''", and "x'''(''' y ''')'''"
 
[[कोटलिन (प्रोग्रामिंग भाषा)|कोटलिन]] ने अपने निर्मिति के बाद से ही ऑपरेटर ओवरलोडिंग का पुष्टि करता है।


==यह भी देखें==
==यह भी देखें==
Line 201: Line 202:
*बहुरूपता (कंप्यूटर विज्ञान)
*बहुरूपता (कंप्यूटर विज्ञान)
*[[सबरूटीन]]
*[[सबरूटीन]]
*[[ऑपरेटर (प्रोग्रामिंग)|संक्रियक (प्रोग्रामिंग)]]
*[[ऑपरेटर (प्रोग्रामिंग)]]
*सी और सी++ में संक्रियक
*सी और सी++ में ऑपरेटर
*म्यूटेटर विधि
*म्यूटेटर विधि
*सूचकांक (प्रोग्रामिंग)
*सूचकांक (प्रोग्रामिंग)
Line 212: Line 213:
{{Authority control}}
{{Authority control}}


{{DEFAULTSORT:Operator Overloading}}[[Category: उदाहरण ALGOL 68 कोड वाले लेख]] [[Category: ऑपरेटर्स (प्रोग्रामिंग)]]
{{DEFAULTSORT:Operator Overloading}}
 
 


[[Category: Machine Translated Page]]
[[Category:All articles with unsourced statements|Operator Overloading]]
[[Category:Created On 11/07/2023]]
[[Category:Articles with unsourced statements from September 2013|Operator Overloading]]
[[Category:CS1 English-language sources (en)]]
[[Category:CS1 errors]]
[[Category:Created On 11/07/2023|Operator Overloading]]
[[Category:Lua-based templates|Operator Overloading]]
[[Category:Machine Translated Page|Operator Overloading]]
[[Category:Pages with script errors|Operator Overloading]]
[[Category:Short description with empty Wikidata description|Operator Overloading]]
[[Category:Templates Vigyan Ready|Operator Overloading]]
[[Category:Templates that add a tracking category|Operator Overloading]]
[[Category:Templates that generate short descriptions|Operator Overloading]]
[[Category:Templates using TemplateData|Operator Overloading]]
[[Category:उदाहरण ALGOL 68 कोड वाले लेख|Operator Overloading]]
[[Category:ऑपरेटर्स (प्रोग्रामिंग)|Operator Overloading]]

Latest revision as of 17:56, 10 August 2023

कंप्यूटर प्रोग्रामिंग में, ऑपरेटर ओवरलोडिंग, जिसे कभी-कभी ऑपरेटर तदर्थ बहुरूपता कहा जाता है, बहुरूपता (कंप्यूटर विज्ञान) का एक विशिष्ट स्थिति होती है, जहां विभिन्न ऑपरेटर के तर्कों के आधार पर अलग-अलग कार्यान्वयन करते हैं। ऑपरेटर ओवरलोडिंग को सामान्यतः एक प्रोग्रामिंग भाषा, एक प्रोग्रामर या दोनों के द्वारा परिभाषित किया जाता है।

मूल कारण

ऑपरेटर ओवरलोडिंग वाक्यात्मक शर्करा होती है, और इसका उपयोग इसलिए किया जाता है क्योंकि डोमेन के निकट संकेतन का उपयोग करके प्रोग्रामिंग की अनुमति देता है[1] और उपयोगकर्ता-परिभाषित प्रकारों को भाषा में निर्मित प्रकारों के समान वाक्य-विन्यास पुष्टि की अनुमति देता है। यह सामान्य है, उदाहरण के लिए, वैज्ञानिक कंप्यूटिंग में, जहां यह गणितीय वस्तुओं के कंप्यूटिंग अभ्यावेदन को कागज पर समान सिन्टैक्स के साथ प्रकलित चर की अनुमति देता है।

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

a + b * c

ऐसी भाषा में जो ऑपरेटर ओवरलोडिंग का पुष्टि करती है, और सामान्य धारणा के साथ कि '*' ऑपरेटर की प्राथमिकता का क्रम '+' ऑपरेटर की तुलना में अधिक है, यह लिखने का एक संक्षिप्त विधि होती है:

Add(a, Multiply(b, c))

चूँकि , पूर्व सिन्टैक्स सामान्य गणितीय उपयोग को दर्शाता है।

उदाहरण

इस स्थिति में, परिवर्धन ऑपरेटर को C++ में उपयोगकर्ता-परिभाषित प्रकार Timeपर जोड़ने की अनुमति देने के लिए अतिभारित किया गया है:

Time operator+(const Time& lhs, const Time& rhs) {
  Time temp = lhs;
  temp.seconds += rhs.seconds;
  temp.minutes += temp.seconds / 60;
  temp.seconds %= 60;
  temp.minutes += rhs.minutes;
  temp.hours += temp.minutes / 60;
  temp.minutes %= 60;
  temp.hours += rhs.hours;
  return temp;
}

संकलन एक बाइनरी ऑपरेशन है, जिसका अर्थ है कि इसमें दो ओपेरंड होते हैं। C++ में, पारित किए जा रहे तर्क ऑपरेंड हैं, और tempऑब्जेक्ट प्रतिगमित मान होते है।

ऑपरेशन को प्रतिस्थापित करते हुए एक क्लास विधि के रूप में भी परिभाषित किया जा सकता है lhsछिपे हुए द्वारा this तर्क; चूँकि, यह बाएँ ऑपरेंड को Time पर होने के लिए बाध्य करता है:

// The "const" right before the opening curly brace means that |this| is not modified.
Time Time::operator+(const Time& rhs) const {
  Time temp = *this;  // |this| should not be modified, so make a copy.
  temp.seconds += rhs.seconds;
  temp.minutes += temp.seconds / 60;
  temp.seconds %= 60;
  temp.minutes += rhs.minutes;
  temp.hours += temp.minutes / 60;
  temp.minutes %= 60;
  temp.hours += rhs.hours;
  return temp;
}

ध्यान दें कि क्लास विधि के रूप में परिभाषित यूनरी ऑपरेटर को कोई स्पष्ट तर्क नहीं मिलेगा (this केवल इससे काम करता है):

bool Time::operator!() const {
  return hours == 0 && minutes == 0 && seconds == 0;
}

किसी संरचना या वर्ग को सॉर्ट करने के लिए कम-से-कम (<) ऑपरेटर को अधिकांशतः अतिभारित किया जाता है:

class Pair {
 public:
  bool operator<(const Pair& p) const {
    if (x_ == p.x_) {
      return y_ < p.y_;
    }
    return x_ < p.x_;
  }

 private:
  int x_;
  int y_;
};

पिछले उदाहरणों की तरह, अंतिम उदाहरण में ऑपरेटर ओवरलोडिंग कक्षा के भीतर किया जाता है। C++ में, कम-से-कम ऑपरेटर (<) को ओवरलोड करने के बाद,कुछ कक्षाओं को सॉर्ट करने के लिए मानक सॉर्टिंग फलन (C++) का उपयोग किया जा सकता है।

आलोचना

ऑपरेटर द्वारा ओवरलोडिंग की अधिकांशतः आलोचना की जाती रही है[2] क्योंकि यह प्रोग्रामर को उनके ऑपरेंड के आधार पर ऑपरेटरों के शब्दार्थ को पुन:सौंपने की अनुमति देता है। उदाहरण के लिए, << C++ ऑपरेटर का उपयोग a << b यदि a औरb एक पूर्णांक प्रकार के हैं तो वेरिएबल a में बिट्स को b बिट्स द्वारा बाईं ओर स्थानांतरित कर देता है, किन्तु यदि aएक आउटपुट स्ट्रीम हैतो उपरोक्त कोड स्ट्रीम में a b लिखने का प्रयास करेगा। क्योंकि ऑपरेटर ओवरलोडिंग मूल प्रोग्रामर को ऑपरेटर के सामान्य शब्दार्थ को बदलने और किसी भी आगामी प्रोग्रामर को आश्चर्यचकित करने की अनुमति देता है, इसलिए ऑपरेटर ओवरलोडिंग का सावधानी से उपयोग करना अच्छा अभ्यास माना जाता है(जावा के रचनाकारों ने इस सुविधा का उपयोग न करने का निर्णय लिया,[3] चूँकि जरूरी नहीं कि इसी कारण से होता है )।

ऑपरेटरों के साथ एक और अधिक सूक्ष्म मुद्दा यह है कि गणित के कुछ नियमों की गलत विधि से अपेक्षा की जा सकती है या अनजाने में मान ली जा सकती है।उदाहरण के लिए, + क्रमविनिमेयता (अर्थात वह a + b == b + a) सदैव लागू नहीं होती ; इसका एक उदाहरण तब होता है जब ऑपरेंड स्ट्रिंग होते हैं, क्योंकि सामान्यतः स्ट्रिंग्स का संयोजन करने के लिए + को अतिभारित किया जाता है (अर्थात "bird" + "song" से "birdsong", प्राप्त होता है, जबकि "song" + "bird" से "songbird") प्राप्त होता है)। इस तर्क का एक विशिष्ट प्रतिवाद सीधे गणित से आता है:[citation needed] जबकि + पूर्णांकों (और सामान्यतः किसी भी जटिल संख्या) पर क्रमविनिमेय है, यह चर के अन्य "प्रकार" के लिए क्रमविनिमेय नहीं होता है।व्यवहार में, + सदैव सहयोगी नहीं होता है,उदाहरण के लिए राउंडिंग त्रुटियों के कारण फ़्लोटिंग-पॉइंट मानों के साथ। एक अन्य उदाहरण: गणित में, गुणन वास्तविक और जटिल संख्याओं के लिए क्रमविनिमेय है किन्तु आव्यूह गुणन में क्रमविनिमेय नहीं होते है।

सूचीपत्र

कुछ सामान्य प्रोग्रामिंग भाषाओं का वर्गीकरण इस आधार पर किया जाता है कि क्या उनके ऑपरेटर प्रोग्रामर द्वारा अतिभारित हैं और क्या ऑपरेटर पूर्वनिर्धारित तक सीमित होते हैं।

ऑपरेटरों अतिभारित नहीं अतिभारित
नया परिभाष्य[4] *ML
सीमित समुच्चय

ऑपरेटर ओवरलोडिंग की समयरेखा

1960

ALGOL 68 विनिर्देशन ने ऑपरेटर को ओवरलोडिंग की अनुमति दी।[44]

ALGOL 68 भाषा विनिर्देश (पृष्ठ 177) से उद्धरण जहां अतिभारित ऑपरेटरों ¬, =, ≠, और abs को परिभाषित किया गया है:

10.2.2. Operations on Boolean Operands
a) op ∨ = (bool a, b) bool:( a | true | b );
b) op ∧ = (bool a, b) bool: ( a | b | false );
c) op ¬ = (bool a) bool: ( a | false | true );
d) op = = (bool a, b) bool:( a∧b ) ∨ ( ¬b∧¬a );
e) op ≠ = (bool a, b) bool: ¬(a=b);
f) op abs = (bool a)int: ( a | 1 | 0 );

ध्यान दें कि किसी ऑपरेटर को ओवरलोड करने के लिए किसी विशेष घोषणा की आवश्यकता नहीं होती है, और प्रोग्रामर मे नए ऑपरेटर बनाने के लिए स्वतंत्र होता है। डायडिक ऑपरेटरों के लिए अन्य ऑपरेटरों की तुलना में उनकी प्राथमिकता निर्धारित की जा सकती है :

 prio max = 9;
 
 op max = (int a, b) int: ( a>b | a | b );
 op ++ = (ref int a) int: ( a +:= 1 );

1980

Ada 83 भाषा मानक के प्रकाशन के साथ, Ada अपनी स्थापना से ही ऑपरेटरों की ओवरलोडिंग का पुष्टि करता है। चूँकि, भाषा डिजाइनरों ने नए ऑपरेटरों की परिभाषा को रोकने का फैसला किया। "+", "*", "&" आदि जैसे पहचानकर्ताओं के साथ नए फलनों को परिभाषित करके, भाषा में केवल सम्मलित ऑपरेटरों को ओवरलोड किया जा सकता है। भाषा के बाद के संशोधनों (1995 और 2005 में) ने मौजूदा ऑपरेटरों की ओवरलोडिंग पर प्रतिबंध बनाए रखते हैं।

C++ में, ऑपरेटर ओवरलोडिंग ALGOL 68 की तुलना में अधिक होते परिष्कृत है।[45]

1990 का दशक

सन माइक्रोसिस्टम्स में जावा भाषा डिजाइनरों ने ओवरलोडिंग को छोड़ने का फैसला किया।[46][47][48]

पायथन विशेष नामों के साथ विधियों के कार्यान्वयन के माध्यम से ऑपरेटर को ओवरलोडिंग की अनुमति देता है।[49] उदाहरण के लिए, अतिरिक्त (+) ऑपरेटर को obj.__add__(self, other) विधि लागू करके ओवरलोड किया जा सकता है।

रूबी सरल विधि कॉल के लिए ऑपरेटर को सिंटैक्टिक शुगर के रूप में ओवरलोडिंग की अनुमति देती है।

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

2000

माइक्रोसॉफ्ट ने 2001 में C# और 2003 में विजुअल बेसिक .NET में ऑपरेटर ओवरलोडिंग युग्मित किया था।

स्काला (प्रोग्रामिंग भाषा) सभी ऑपरेटरों को विधियों के रूप में मानता है और इस प्रकार ऑपरेटर को प्रॉक्सी द्वारा ओवरलोडिंग की अनुमति देता है।

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

 multi infix:<+>(Date:D $d, Int:D $x) {
Date.new-from-daycount($d.daycount + $x)
}


चूँकि "बहु" का उपयोग किया गया था, फलन मल्टीडिस्पैच उम्मीदवारों की सूची में जुड़ जाता है, और "+" केवल उस स्थिति के लिए अतिभारित है जहां फलन चिहनक में प्रकार की व्यवरोध पूरी होती हैं। जबकि ओवरलोडिंग की क्षमता में +, *, >=, पोस्टफिक्स और टर्म i इकाई इत्यादि सम्मलित होती हैं, यह विभिन्न ब्रेस ऑपरेटरों को ओवरलोड करने की भी अनुमति देता है: "[x, y]", "x[ y ]", "x{ y }", and "x( y )"

कोटलिन ने अपने निर्मिति के बाद से ही ऑपरेटर ओवरलोडिंग का पुष्टि करता है।

यह भी देखें

संदर्भ

  1. Stroustrup, Bjarne. "ऑपरेटर ओवरलोडिंग". C++ FAQ. Archived from the original on 14 August 2011. Retrieved 27 August 2020.
  2. Fisher, Charles N. (2008). "ओवरलोडिंग में समस्याएँ" (PDF). University of Wisconsin–Madison.
  3. "अब ऑपरेटर ओवरलोडिंग नहीं करेगा". The Java Language Environment. Oracle Corporation.
  4. Completely new operators can be added.
  5. Binary functions with a symbolic name can be called infix.
  6. "Predicate op/3".
  7. Hunt, John (6 December 2012). Smalltalk and Object Orientation: An Introduction. Springer Science & Business Media. ISBN 978-1-4471-0961-7.
  8. "Bertrand Meyer: Basic Eiffel language mechanisms". se.ethz.ch. Retrieved 2021-04-07.
  9. "Operator functions in F90". www.mathcs.emory.edu. Retrieved 2021-04-07.
  10. Introduced in Fortran 90.
  11. "3. Language Reference — Futhark 0.19.0 documentation". futhark.readthedocs.io. Retrieved 2020-10-10.
  12. Smith, Chris (9 October 2012). Programming F# 3.0: A Comprehensive Guide for Writing Simple Code to Solve Complex Problems. O'Reilly Media, Inc. ISBN 978-1-4493-2604-3.
  13. Type classes instead of overloading.
  14. "io guide". iolanguage.org. Retrieved 2021-04-07.
  15. "Operators".
  16. "Operators - R in a Nutshell, 2nd Edition [Book]". www.oreilly.com (in English). Retrieved 2021-04-07.
  17. "Creating operators".
  18. "Operators". Tour of Scala.
  19. "Seed7 Manual: Structured syntax definition". seed7.sourceforge.net. Retrieved 2020-09-29.
  20. "Swift: Advanced Operators".
  21. "Why does Go not support overloading of methods and operators?". Retrieved 4 September 2011.
  22. "Introduction". freepascal.org. Retrieved 2020-09-30.
  23. "Operator Overloads". Retrieved 28 September 2018.
  24. "6.6 Overloading of Operators". Annotated Ada Reference Manual.
  25. Drayton, Peter; Albahari, Ben; Neward, Ted (2003). C# in a Nutshell. O'Reilly Media, Inc. ISBN 978-0-596-00526-9.
  26. "C++ Operator Overloading".
  27. "Eclipse Ceylon: Operator Polymorphism". ceylon-lang.org. Retrieved 2021-04-07.
  28. "Operator Overloading - D Programming Language". dlang.org. Retrieved 2020-10-10.
  29. "A tour of the Dart language". dart.dev. Retrieved 2020-09-30.
  30. "Operator Overloading". bourabai.kz. Retrieved 2021-04-07.
  31. "The Apache Groovy programming language - Operators". groovy-lang.org. Retrieved 2020-09-30.
  32. "Operator Overloading". Manifold. Retrieved 7 June 2020.
  33. "Operator overloading". Kotlin. Retrieved 24 June 2018.
  34. "Metamethods Tutorial". Lua-users Wiki.
  35. "Implementing Operators for Your Class". Retrieved 1 October 2013.
  36. "Operator Overloading". Free Pascal Manual. Retrieved 1 December 2014.
  37. "Operator Overloading". Delphi Manual. Retrieved 1 December 2014.
  38. "PHP magic methods overriding class properties". Archived from the original on 4 March 2016. Retrieved 7 April 2015.
  39. Orwant, Jon (4 November 2002). Computer Science & Perl Programming: Best of The Perl Journal. O'Reilly Media, Inc. pp. 347–. ISBN 978-0-596-00310-4.
  40. "3. Data Model". The Python Language Reference.
  41. "Methods". Official Ruby FAQ.
  42. "Operator Overloading". Rust By Example.
  43. "How to: Define an Operator (Visual Basic)".
  44. =Barry J. Mailloux "Report on the Algorithmic Language ALGOL 68, Section 10.2.2". August 1968. Retrieved 1 April 2007. {{cite web}}: Check |url= value (help)
  45. Stroustrup, Bjarne. "A History of C++: 1979−1991" (PDF). p. 12. Retrieved 1 April 2007.
  46. "FAQ Question 6.9: Why isn't there operator overloading?". The comp.lang.java FAQ List.
  47. "जावा.सुन.कॉम". Archived from the original on 7 March 2009. Retrieved 26 March 2009.
  48. Holzner, Steven (2001). C++: Black Book. Scottsdale, Arizona: Coriolis Group. p. 387. ISBN 1-57610-777-9. One of the nicest features of C++ OOP is that you can overload operators to handle objects of your classes (you can't do this in some other OOP-centric languages, like Java).
  49. "3. Data Model, Special method names". The Python Language Reference.