ऑपरेटर ओवरलोडिंग

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

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

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

a + b * c

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

Add(a, Multiply(b, c))

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

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

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

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

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

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

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

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

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

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

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

10.2.2. बूलियन ऑपरेंड पर संचालन ए) ऑप ∨ = (बूल ए, बी) बूल:(ए | सच | बी); बी) ऑप ∧ = (बूल ए, बी) बूल: (ए | बी | गलत); सी) ऑप ¬ = (बूल ए) बूल: (ए | गलत | सच); डी) ऑप = = (बूल ए, बी) बूल:( ए∧बी ) ∨ ( ¬बी∧¬ए ); ई) ऑप ≠ = (बूल ए, बी) बूल: ¬(ए=बी); एफ) ऑप एबीएस = (बूल ए)इंट: (ए | 1 | 0);

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

प्रियो अधिकतम = 9; op max = (int a, b) int: ( a>b | a | b ); op++ = (संदर्भ int a) int: ( a +:= 1 );

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

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

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

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

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

2000
माइक्रोसॉफ्ट ने 2001 में C शार्प (प्रोग्रामिंग भाषा)|C# और 2003 में विजुअल बेसिक .NET में ऑपरेटर ओवरलोडिंग जोड़ा।

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

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

 मल्टी इन्फ़िक्स:<+>(दिनांक:D $d, Int:D $x) { दिनांक.नया-से-दिनगणना($d.दिनगणना + $x) } 

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

कोटलिन (प्रोग्रामिंग भाषा) ने अपने निर्माण के बाद से ही ऑपरेटर ओवरलोडिंग का समर्थन किया है।

यह भी देखें

 * फ़ंक्शन ओवरलोडिंग
 * बहुरूपता (कंप्यूटर विज्ञान)
 * सबरूटीन
 * ऑपरेटर (प्रोग्रामिंग)
 * सी और सी++ में ऑपरेटर
 * म्यूटेटर विधि
 * सूचकांक (प्रोग्रामिंग)
 * संपत्ति (प्रोग्रामिंग)