Constructor and Destructor

    Constructor

    Constructor (कंस्ट्रक्टर) एक विशेष प्रकार के Member Function(मैम्बर फंक्शन) होते हैं, जो उस Class का Object बनाते time call हो जाते हैं। इनका प्रयोग Object(ऑब्जेक्ट) को initialize (इनिशियलाइज) करने के लिए किया जाता है। इनका नाम वही होता है जो इनकी क्लास का नाम होता है।

    उदाहरण के लिए demo नाम की क्लास के अन्दर यदि Constructor (कंस्ट्रक्टर)  फंक्शन बनाया जाता है तो उसका नाम भी demo ही होगा। Constructor (कंस्ट्रक्टर) फंक्शन की निम्न विशेषताए होती है.

    • इन्हें क्लास के Public(पब्लिक) Mode(मोड) में Define(डिफाइन) करना चाहिए।
    • Class का Object(ऑब्जेक्ट) बनाते समय Constructor (कंस्ट्रक्टर)  फंक्शन अपने-आप call हो जाते हैं।
    • इनका कोई return type(रिटर्न टाइप) नहीं होता है। यहां तक कि vold भी नहीं।
    •  इन्हें इन्हेरिट नहीं किया जा सकता है, किन्तु इन्हें चाइल्ड क्लास के Constructor (कंस्ट्रक्टर)  द्वारा कॉल किया जा सकता है।
    • इनमें default Argument(डिफॉल्ट आरग्यूमेंट्स) का प्रयोग किया जा सकता है।
    • एक क्लास के अन्दर कई Constructor (कंस्ट्रक्टर) फंक्शन बनाए जा सकते हैं, अर्थात Constructor (कंस्ट्रक्टर) Overloading(ओवरलोडिंग) की जा सकती है।
    • इन्हें visual Function(वर्चुअल फंक्शन) नहीं बनाया जा सकता। 

    Type of Constructor

    1. Default Constructors
    2. Parameterized Constructors
    3. Copy Constructors
    Constructor in C++, w3 coding club, w3 coding club

    1. Default Constructor(डिफॉल्ट कंस्ट्रक्टर)

    यदि किसी Constructor(कंस्ट्रक्टर) में एक भी Argument(आरम्यूमेंट) पास नहीं किया जाए तो ऐसे Constructor(कंस्ट्रक्टर) को Default Constructor  कहते है। इसका प्रारूप निम्नानुसार होता है.

    class demo
    {
            . . . . . . . . . . . . . 
            public:
            . . . . . . . . . . . . . 
            demo(){
                       . . . . . . . . . . .
                       . . . . . . . . . . .        
            }    
            . . . . . . . . . . . . .
    };

    Examples #01:-

    उदाहरण नीचे दिए गए उदाहरण में भी डिफॉल्ट कंस्ट्रक्टर को समझाया गया है।


        #include <iostream>
        #include <conio.h>
        using namespace std;
        class demo
        {
        public:
            demo()
            {
                cout << "Constructor called ";
            }
        };
        int main()
        {
            demo d; // default Constructor called
            getch();
        }

    Output:-

    Constructor called

    Explain Example:-

    उपरोक्त उदाहरण में एक क्लास demo बनाई गई है। इस क्लास के Public Mode(पब्लिक मोड) में demo नाम का ही एक Constructor(कंस्ट्रक्टर) बनाया गया है। इस Constructor(कंस्ट्रक्टर) में एक भी Argument (आरग्यूमेंट) नहीं है इसलिए ये एक Default Constructor(डिफॉल्ट कंस्ट्रक्टर) है । main() फंक्शन में हमने demo क्लास का एक ऑब्जेक्ट 'd' बनाया है। इस ऑब्जेक्ट को बनाते ही Default Constructor(डिफॉल्ट कंस्ट्रक्टर) Call हो जाएगा तथा आउटपुट के रूप में एक मैसेज(Constructor called) प्रिंट हो जाएगा।

    Example #02:-

    उदाहरण नीचे दिए गए उदाहरण में भी Default Constructor (डिफॉल्ट कंस्ट्रक्टर) को समझाया गया है।


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

        public:
            demo()
            {
                a = 10;
                b = 20;
            }
            void show()
            {
                cout << "a = " << a;
                cout << "b = " << b;
            }
        };
        int main()
        {
            demo d;
            d.show();
            getch();
            return 0;
        }

    Output:-

    a = 10
    b = 20

    Explain Example:-

    उपरोक्त उदाहरण में एक क्लास demo बनाई गई है। इस क्लास में दो variable(वेरिएबल) 'a' तथा 'b' का प्रयोग किया गया है। इस क्लास में बनाए गए Constructor(कंस्ट्रक्टर) में इन दोनों variable(वेरिएबल) में 'a = 10' और 'b = 20'  वैल्यू सेट कर दी गई है। main () फंक्शन में demo क्लास का ऑब्जेक्ट बनाते ही उस ऑब्जेक्ट के लिए  variable(वेरिएबल)  'a = 10' और variable(वेरिएबल)  'b = 20'    वैल्यू  सेट हो जाएगी। इस ऑब्जेक्ट की सहायता से क्लास के show() फंक्शन को कॉल करने पर दोनों वेरिएबल्स की वैल्यूज़ प्रिंट हो जाएंगी। उपरोक्त उदाहरण में प्रयोग किए गए कंस्ट्रक्टर को भी Default Constructor(डिफॉल्ट कंस्ट्रक्टर) कहा जाएगा क्योंकि इसमें एक भी Argument(आरग्यूमेंट) पास नहीं किया जा रहा है।


    2. Parameterized Constructor(पैरामीटराइज़्ड कंस्ट्रक्टर)

    यदि किसी Constructor(कंस्ट्रक्टर) में Argument(आरग्यूमेंट) पास किये जाएं तो ऐसे Constructor(कंस्ट्रक्टर) को Parameterized Constructor(पैरामीटराइज़्ड कंस्ट्रक्टर) कहते हैं। इसका प्रारुप निम्नानुसार होता है:

    class demo
    {
        . . . . . . . .
        public:
        . . . . . . . . 
        demo(arg. list)
        {
                . . . . . . . .  . 
                . . . . . . . .  . 
        }
    };

    Example:-

    नीचे दिए गए उदाहरण में Parameterized Constructor(पैरामीटराइज़्ड कंस्ट्रक्टर) को समझाया गया है।


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

        public:
            demo()
            {
                a = 0;
                b = 0;
            }
            demo(int x, int y)
            {
                a = x;
                b = y;
            }
            void show()
            {
                cout << "\na = " << a;
                cout << "\tb = " << b;
            }
        };
        int main()
        {
            demo d1; //  Default Constructor called
            demo d2(10, 20); //  Parameterized Constructor called
            d1.show();
            d2.show();
            getch();
            return 0;
        }

    Output:-

    a = 0   b = 0 
    a = 10  b = 20

    Explain Example:-

    उपरोक्त उदाहरण में एक क्लास demo बनाई गई है। इस क्लास में दो कस्ट्रक्टर बनाए गए हैं। पहले कंस्ट्रक्टर में एक भी Argument(आरग्यूमेंट) नहीं है अर्थात् यह एक Default Constructor(डिफॉल्ट कंस्ट्रक्टर) है। दूसरे Constructor(कंस्ट्रक्टर) में दो Integer(इंटीजर) Arguments(आरग्यूमेंट्स) का प्रयोग किया गया है अर्थात् यह एक Parameterized Constructor(पैरामीटराइज़्ड कंस्ट्रक्टर)  है। main() फक्शन में demo क्लास का 'd1' ऑब्जेक्ट बनाते समय एक भी आरम्यूमेंट पास नहीं किया गया है अतः इस समय डिफॉल्ट कंस्ट्रक्टर कॉल हुआ है तथा इसी क्लास का 'd2' ऑब्जेक्ट बनाते समय दो Integer(इंटीजर) Arguments(आरग्यूमेंट्स) पास किए गए हैं अतः इस समय Parameterized Constructor(पैरामीटराइज़्ड कंस्ट्रक्टर)  call हुआ है। इन दोनों ही ऑब्जेक्ट्स की सहायता से show() फंक्शन को कॉल करने पर इनकी वैल्यूज प्रिंट हुई है।


    Implicit  and Explicit Call

    कंस्ट्रक्टर को निम्न दो प्रकार से कॉल किया जा सकता है

    1. Implicitly Call
    2. Explicitly Call

    1. Implicitly  Call

    Implicit Call में Class का Object(ऑब्जेक्ट) बताते समय Constructor(कंस्ट्रक्टर) अपने-आप कॉल हो जाता है। अभी तक दिए गए उदाहरणों में कंस्ट्रक्टर को Implicitly ही कॉल किया गया है।

    Example:-

    demo d;
    demo d2 (10, 20);

    2. Explicitly Call

    Explicit Call में Constructor(कंस्ट्रक्टर) को Call करने के लिए Object(ऑब्जेक्ट) बनाते समय उस Constructor(कंस्ट्रक्टर) Function(फंक्शन) का नाम देना आवश्यक होता है।

    Example:-

    demo d = demo();
    demo d2  = demo(10, 20);

    यदि किसी Object(ऑब्जेक्ट) के लिए Constructor(कंस्ट्रक्टर) को प्रोग्राम के रन होने के दौरान पुन: कॉल कराना हो तो ऐसी स्थिति में explicit कॉल का प्रयोग किया जाता है।

    Example:-

    नीचे दिए गए उदाहरण में कंस्ट्रक्टर के Implicit Call  तथा Explicit Call  को समझाया गया हैं। 


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

        public:
            demo()
            {
                a = 0;
                b = 0;
            }
            demo(int x, int y)
            {
                a = x;
                b = y;
            }
            void show()
            {
                cout << "\na = " << a;
                cout << "\tb = " << b;
            }
        };
        int main()
        {
            demo d1;                // Implicit Call
            demo d2 = demo(10, 20); // Explicit Call

            d1.show();
            d2.show();

            d2 = demo(30, 40); // Explicit call
            d2.show();
            getch();

            return 0;
        }

    Output:-

    a = 0   b = 0 
    a = 10  b = 20
    a = 30  b = 40

    Explain Example:- 

    उपरोक्त उदाहरण में एक क्लास demo बनाई गई है। इस क्लास में दो Constructor(कंस्ट्रक्टर) बनाए गए. हैं। इनमें से एक Default Constructor(कंस्ट्रक्टर)है तथा दूसरा Parameterized Constructor(पैरामीटराइज़्ड कंस्ट्रक्टर) है।  main() फंक्शन में demo क्लास का d1 ऑब्जेक्ट बनाया गया है उस समय Default Constructor(डिफॉल्ट कस्ट्रक्टर) को implicitly कॉल किया गया है जबकि d2 ऑब्जेक्ट को बनाते समय Parameterized Constructor(पैरामीटराइज़्ड कंस्ट्रक्टर)  को explicitly कॉल किया गया है। main ( ) फंक्शन में ही इन ऑब्जेट्स की वैल्यूज प्रिंट कराने के बाद d2 ऑब्जेक्ट के वेरिएबल्स की वैल्यूज़ Change करने के लिए हमने पुनः Parameterized Constructor(पैरामीटराइज़्ड कंस्ट्रक्टर)  को explicitly कॉल किया है तथा d2 ऑब्जेक्ट के वेरिएबल्स की वैल्यूज़ को पुनः प्रिंट कराया है।


    3. Copy Constructor:-

    Copy Constructor (कॉपी कंस्ट्रक्टर ) का प्रयोग एक Object(ऑब्जेक्ट) को दूसरे Object(ऑब्जेक्ट) से initialize(इनिशियलाइज़) करने के लिए किया जाता है। अर्थात् Copy Constructor (कॉपी कंस्ट्रक्टर) की सहायता से हम एक Object(ऑब्जेक्ट) के वेरिएबल्स की वैल्यूज़ को दूसरे ऑब्जेक्ट के वेरिएबल्स में कॉपी कर सकते हैं। Copy Constructor (कॉपी कंस्ट्रक्टर) को निम्नानुसार कॉल किया जा सकता

    class_name object_name1 (object_name 2) ;

     or

    class_name object_name1=object_name2;

    Example:-

           
        demo d2(d1) ;
        demo d2 = d1 ;


    यदि हम एक Object(ऑब्जेक्ट) को दूसरे Object(ऑब्जेक्ट)  मे सीधे ही स्टोर करते हैं (Example:- d2=d1) तो Object(ऑब्जेक्ट)  के Variable(वेरिएबल्स) की वैल्यूज़ तो दूसरे Object(ऑब्जेक्ट)  के Variable(वेरिएबल्स) में Store हो जाती हैं किंतु ऐसी स्थिति में Copy Constructor(कॉपी कंस्ट्रक्टर) कॉल नहीं होता है।

    Copy Constructor(कॉपी कंस्ट्रक्टर) में साधारणतः ऑब्जेक्ट के रेफ्रेंस का प्रयोग किया जाता है। इसका प्रारुप निम्नानुसार होता है.

    class demo
    {
            . . . . . . . . .
            public:
            . . . . . . . . . 
            demo(demo &obj){
                    . . . . . . . . . .
                    . . . . . . . . . .
            }
            . . . . . . . . . 
    };

    Example:-

    नीचे दिए गए उदाहरण में कॉपी कंस्ट्रक्टर के प्रयोग को समझाया गया है।


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

        public:
            demo()
            {
                a = 0;
                b = 0;
            }
            demo(int x, int y)
            {
                a = x;
                b = y;
            }
            demo(demo &ob)
            {
                cout << "\nCopy Constructor Called";
                a = ob.a;
                b = ob.b;
            }
            void show()
            {
                cout << "\n a = " << a;
                cout << "\t b = " << b;
            }
        };
        int main()
        {
            demo d1(10, 20);
            demo d2 = d1;
            demo d3(d1);
            cout << "\nValues for Object d2 are : ";
            d2.show();
            cout << "\nValues for Object d3 are : ";
            d3.show();
        }

    Output:-

    Copy Constructor Called    
    Copy Constructor Called    
    Values for Object d2 are : 
     a = 10  b = 20
    Values for Object d3 are : 
     a = 10  b = 20

    Explain  Example:- 

    उपरोक्त उदाहरण में एक क्लास demo बनाई गई है। इस क्लास में तीन Constructor(कंस्ट्रक्टर) बनाए गए हैं। इनमें से एक डिफॉल्ट Constructor(कंस्ट्रक्टर) है तथा दो Parameterized Constructor(पैरामीटराइज़्ड कंस्ट्रक्टर)   है। पहले Parameterized Constructor(पैरामीटराइज़्ड कंस्ट्रक्टर)   में दो इंटीजर आरग्यूमेंट्स हैं तथा दूसरेParameterized Constructor(पैरामीटराइज़्ड कंस्ट्रक्टर)   में आरग्यूमेंट के तौर पर इसी क्लास के ऑब्जेक्ट का रेफ्रेंस है। इस दूसरेParameterized Constructor(पैरामीटराइज़्ड कंस्ट्रक्टर)   को ही कॉपी कंस्ट्रक्टर कहा जाता है। main () फंक्शन में जब demo d2=d1 स्टेट्मेंट रन होती है तो Copy Constructor(कंस्ट्रक्टर) call हो जाता है तथा d1 ऑब्जेक्ट इसमें आरग्यूमेंट की तरह पास हो जाता है और इस Constructor(कंस्ट्रक्टर) की सहायता से ऑब्जेक्ट d1 के वेरिएबल्स की वैल्यूज़ ऑब्जेक्ट d2 के वेरिएबल्स में Copy हो जाती हैं। इसी प्रकार एक अन्य स्टेट्मेंट demo d3(d1) के रन होते ही फिर से Copy Constructor(कॉपी कंस्ट्रक्टर) कॉल हो जाता है तथा ऑब्जेक्ट d1 के वेरिएबल्स की वैल्यूज़ ऑब्जेक्ट d3 के वेरिएबल्स में कॉपी हो जाती हैं। इन ऑब्जेट्स के वेरिएबल्स की वैल्यूज को प्रदर्शित करने के लिए प्रत्येक ऑब्जेक्ट के लिए show() फंक्शन को कॉल किया गया है।

    Destructor in C++

    Destructor(डिस्ट्रक्टर) एक instance member function(इंस्टेंस मेंबर फंक्शन) है जिसे जब भी कोई Object(ऑब्जेक्ट) destroyed होने वाला होता है तो अपने आप invoked हो जाता है। मतलब, एक Destructor(डिस्ट्रक्टर) last function है जिसे किसी Object(ऑब्जेक्ट) के destroyed होने से पहले Call किया जाता हैं।

    C++ में Destructor(डिस्ट्रक्टर) एक Class में member function होते हैं जो किसी Destructor को Delete करते हैं। उन्हें तब call किया जाता है जब क्लास ऑब्जेक्ट scope(स्कोप) से बाहर हो जाता है जैसे कि जब फंक्शन end होता है, Program end(समाप्त) होता है, कह सकते हैं कि यह एक डिलीट वेरिएबल है।

    Destructors normal(सामान्य) member functions से अलग होते हैं क्योंकि वे कोई argument नहीं लेते हैं और कुछ भी return नहीं करते हैं। इसके अलावा, Destructors का नाम उनके class के समान होता है और उनका नाम tilde(~) से पहले होता है।

    Example:-

    C++ में destructors  को demonstrates  करने वाला एक Program


        #include <iostream>
        using namespace std;
        class Demo{
            private:
                int num1, num2;

            public:
                Demo(int n1, int n2){
                    cout << "Inside Constructor" << endl;  
                    num1 = n1;
                    num2 = n2;
                }
                void display(){
                    cout << "num1 = " << num1 << endl;
                    cout << "num2 = " << num2 << endl;
                }
                ~Demo(){
                    cout << "Inside Destructor";
                }
        };
        int main(){
            Demo obj1(10, 20);
            obj1.display();
            return 0;
        }

    Output:-

    Inside Constructor
    num1 = 10
    num2 = 20
    Inside Destructor 

    Explain Example:-

    उपरोक्त कार्यक्रम में, क्लास demo में एक parameterized constructor है जो n1 और n2 द्वारा प्रदान किए गए मानों के साथ num1 और num2 को initializes(इनिशियलाइज़) करता है। इसमें एकfunction display() भी है जो num1 और num2 के मान को print करता है। demo में एक destructor भी है जिसे क्लास Object का scope समाप्त होने पर call किया गया है।

     इसके लिए Code snippet निम्नानुसार दिया गया है।


        class Demo {
        private:
        int num1, num2;
        public:
        Demo(int n1, int n2) {
            cout<<"Inside Constructor"<<endl;
            num1 = n1;
            num2 = n2;
        }
        void display() {
            cout<<"num1 = "<< num1 <<endl;
            cout<<"num2 = "<< num2 <<endl;
        }
        ~Demo() {
            cout<<"Inside Destructor";
        }
        };


    Post a Comment

    2 Comments

    1. pata to nahi lag raha kya hain ye sab lekin website ka design bahut achcha hain muksa

      ReplyDelete
    2. till the keep learning and exploring

      ReplyDelete