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

From Vigyanwiki

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

तर्कसंगत

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

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

a + b * c

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

Add(a, Multiply(b, 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] यह तर्क सीधे गणित से आता है: जबकि + पूर्णांकों (और आमतौर पर किसी भी जटिल संख्या) पर क्रमविनिमेय है, यह अन्य प्रकार के चर के लिए क्रमविनिमेय नहीं है। व्यवहार में, + हमेशा ऑपरेटर संबद्धता भी नहीं होती है, उदाहरण के लिए राउंडिंग त्रुटियों के कारण फ़्लोटिंग-पॉइंट मानों के साथ। एक अन्य उदाहरण: गणित में, गुणन वास्तविक और जटिल संख्याओं के लिए क्रमविनिमेय है लेकिन आव्यूह गुणन में क्रमविनिमेय नहीं है।

कैटलॉग

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

Operators Not overloadable Overloadable
New definable[4]
Limited set


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

1960

ALGOL 68 विनिर्देशन ने ऑपरेटर को ओवरलोडिंग की अनुमति दी।[44] 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 की तुलना में अधिक परिष्कृत है।[45]


1990 का दशक

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

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

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

2000

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

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

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

<सिंटैक्सहाइलाइट लैंग= पर्ल6 > मल्टी इन्फ़िक्स:<+>(दिनांक:D $d, Int:D $x) {

   दिनांक.नया-से-दिनगणना($d.दिनगणना + $x)

} </सिंटैक्सहाइलाइट>

चूँकि बहु का उपयोग किया गया था, फलन मल्टीडिस्पैच उम्मीदवारों की सूची में जुड़ जाता है, और + केवल उस स्थिति के लिए अतिभारित होता है जहां फलन हस्ताक्षर में प्रकार की बाधाएं पूरी होती हैं। जबकि ओवरलोडिंग की क्षमता में +, *, >=, काल्पनिक इकाई इत्यादि शामिल हैं, यह विभिन्न ब्रेस ऑपरेटरों को ओवरलोड करने की भी अनुमति देता है: "[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.