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

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

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

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

a + b * c

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

Add(a, Multiply(b, c))

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

उदाहरण
इस स्थिति में, परिवर्धन ऑपरेटर को 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. 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 की तुलना में अधिक होते परिष्कृत है।

1990 का दशक
सन माइक्रोसिस्टम्स में जावा भाषा डिजाइनरों ने ओवरलोडिंग को छोड़ने का फैसला किया।

पायथन विशेष नामों के साथ विधियों के कार्यान्वयन के माध्यम से ऑपरेटर को ओवरलोडिंग की अनुमति देता है। उदाहरण के लिए, अतिरिक्त (+) ऑपरेटर को 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 )"

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

यह भी देखें

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