Operator Overloading - w3 coding club

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

    int a, b, c;
    - - - -
    c = a + b;

    c = a + b; उपरोक्त उदाहरण में a + b एक valid स्टेटमेंट है, जिसका परिणाम c नाम के variable(वेरिएबल) में स्टोर हो जाएगा। यदि Expression निम्नानुसार हो तो..

    Item i1, i2, i3;
    - - -
    i3 = i1 + i2;

    जिसमें Item क्लास निम्नानुसार है.

    class item
    {
        int  a;
        . . . 
        . . . 
    };

    ऐसी स्थिति में i1 + i2 एक Invalid स्टेटमेंट होगा। इसका कारण है कि '+' Operator (ऑपरेटर) दो integer(इंटीज़र ) को तो जोड़ सकता है,  किन्तु दो item को नहीं। 

    Operator Overloading(ऑपरेटर ओवरलोडिंग) में यह संभव है कि Operator(ऑपरेटर) को एक अतिरिक्त अर्थ (Item के संदर्भ में) प्रदान कर दिया जाए ताकि उपरोक्त स्टेटमेंट valid स्टेटमेंट बन सके।

    इसके लिए Item क्लास में एक operator कीवर्ड को प्रयोग करते हुए एक Function बनाना होगा।

    Operator Function का प्रारूप निम्नानुसार है

    returnDatatype Operator <op> (arguments)
    {
        - - - - 
    }

    उपरोक्त में <op> से आशय Basics Operator(बेसिक ऑपरेटर्स) जैसे +, -, << आदि से है।


        #include <iostream>
        using namespace std;

        class Complex
        {
        private:
            int real, imag;

        public:
            Complex(int r = 0, int i = 0)
            {
                real = r;
                imag = i;
            }

            // This is automatically called when '+' is used with
            // between two Complex objects
            Complex operator+(Complex const &obj)
            {
                Complex res;
                res.real = real + obj.real;
                res.imag = imag + obj.imag;
                return res;
            }
            void print() { cout << real << " + i" << imag << '\n'; }
        };

        int main()
        {
            Complex c1(10, 5), c2(2, 4);
            Complex c3 = c1 + c2;
            c3.print();
        }

     Output:-

    12 + i9

    ध्यान दें कि कुछ Operator(ऑपरेटर्स) ऐसे हैं, जिन्हें Overload(ओवरलोड) नहीं किया जा सकता है। ऐसे ऑप्रेटर निम्नानुसार है.

    Operator Overloading, w3 coding club, w3codingclub


    Unary Operators Overloading in C++

    हम जानते हैं कि Unary Operators(ऑपरेटर्स) को सिर्फ एक ही Operand (ऑपरेंड) की आवश्यकता होती है। उदाहरण के लिए ++ तथा unary ऑपरेटर हैं। ऐसे ऑपरेटर्स को किसी Class में Overload(ओवरलोड) करने के लिए उस - Class(क्लास) में operator <op> (...) फंक्शन बनाना होता है। इसका प्रारूप निम्नानुसार है:

    class <classname>
    {
        ........
        void operator <op>()
        {
            ......
        }
    };

    Example:-


        class Item{
            int a;
            public:
            void getdata();
            void printdata();
            void operator ++(){
                a++;
            };
        }


    जब main () में Item के आधार पर ऑब्जेक्ट बनाया जाएगा और इस ऑब्जेक्ट पर ++ ऑपरेटर प्रयोग किया जाएगा तो स्वतः operator ++ () फंक्शन कॉल हो जाएगा और वेरिएबल a में इंक्रीमेंट कर देगा।

    Example:-

    निम्न उदाहरण में ऑपरेटर को ओवरलोड करते हुए प्रयोग किया गया है:


        #include <iostream>
        #include <conio.h>
        using namespace std;

        class Item
        {
            int a;

        public:
            void getdata()
            {
                cout << "Enter value for a : ";
                cin >> a;
            }
            void printdata()
            {
                cout << "Value of a is : " << a;
            }
            void operator++(int)
            {
                a++;
            }
        };

        int main()
        {
            Item i1;
            i1.getdata();
            i1++; // automatically call oprerator++()
            i1.printdata();
            getch();
            return 0;
        }

    Output:-

    Enter value for a : 45
    Value of a is : 46

    Explain Example:-

    उपरोक्त उदाहरण में जब i1++; Statement रन होगी तो स्वतः operator++() फंक्शन कॉल हो जाएगा। चूंकि operator ++ () फंक्शन को i1 के माध्यम से कॉल करवाया जाएगा अतः यह फंक्शन i1 के Member a को प्रयोग कर सकता है। इसी कारण से यह फंक्शन i1 के a Member में increment(इंक्रीमेंट) कर पा रहा है। जिस प्रकार int variable में ++ से increment(इंक्रीमेंट) किया जाता है, उसी प्रकार उपरोक्त उदाहरण में किया गया है। किन्तु जिस प्रकार int expression में increment(इंक्रीमेंट) के साथ-साथ assignment भी किया जा सकता है, वैसे ही यदि उपरोक्त उदाहरण में किया जाए तो वह कार्य नहीं करेगा।

       i2 = i1++ //invalid expression

    इसका कारण है कि operator ++ () कुछ भी रिटर्न नहीं कर रहा है। उपरोक्त स्टेटमेंट कार्य करे इसके लिए हमें operator++() द्वारा int वैल्यू रिटर्न करवानी होगी।

    Example:-

    निम्न उदाहरण में operator++ () Function(फंक्शन) Integer(इंटीजर) Value(वैल्यू) रिटर्न कर रहा है.


        #include <iostream>
        #include <conio.h>
        using namespace std;

        class Item
        {
            int a;

        public:
            void getdata()
            {
                cout << "Enter value for a : ";
                cin >> a;
            }
            void printdata()
            {
                cout << "\nValue of a is : " << a;
            }
            int operator++(int)
            {
                a++;
                return (a);
            }
        };
        int main()
        {
            Item ob1;
            int i;
            ob1.getdata();
            i = ob1++;
            cout << "Value of i is : " << i;
            ob1.printdata();
            getch();
            return 0;
        }

    Output:-

    Enter value for a : 125
    Value of i is : 126
    Value of a is : 126

    Explain Example:-

    उपरोक्त उदाहरण में जब i = 0b1++; statement रन होगी तो operator++() फंक्शन a में इंक्रीमेंट करते हुए a को रिटर्न कर रहा है। यह रिटर्न करवायी जा रही वैल्यू वेरिएबल में स्टोर करवाई जा रही है।

    Prefix और Postfix में अंतर

    C++ में Increment(इंक्रीमेंट) तथा Decrement(डिक्रीमेंट) ऑपरेटर को Overlord(ओवरलोड) करते समय prefix के लिए अलग तथा postfix के लिए अलग-अलग बनाया जा सकता है। इसमें जहां pre increment के लिए फंक्शन को कोई भी Argument(आरग्यूमेंट) पास नहीं कराया जाता हैं, वहीं post increment के लिए आरग्यूमेंट की जगह पर सिर्फ int कीवर्ड लिख दिया जाता है।

    int operator++ ()          // Pre Increment Version
    int operator++ (int )    // Post Increment Version

    Example:-

    निम्न उदाहरण में prefix तथा postfix increment ऑपरेटर को अलग-अलग प्रकार से overload(ओवरलोड) किया गया है:


        #include <iostream>
        #include <conio.h>
        using namespace std;
        class Item
        {
            int a;

        public:
            Item() {}
            Item(int x)
            {
                a = x;
            }
            void printdata()
            {
                cout << "\nValue of a : " << a;
            }
            int operator++()
            {
                cout << "Pre Increment Version ";
                return (++a);
            }
            int operator++(int)
            {

                cout << "Post Increment Version ";
                return (a++);
            }
        };
        int main()
        {
            Item i1(501);
            cout << endl
                << i1++;
            cout << endl
                << ++i1;
            getch();
            return 0;
        }

    Output:-

    Post Increment Version 501
    Pre Increment Version 503 

    Explain Example:-

    उपरोक्त उदाहरण में जब i1++ रन होगा तो चूंकि यह post increment है अतः (operator ++ (int) फंक्शन रन हो जाएगा। दूसरी ओर जब ++i1 रन होगा तो pre increment होने के कारण operator ++ () फंक्शन रन हो जाएगा।


    Post a Comment

    0 Comments