आइए तुलना चार्ट की मदद से निर्माता और विध्वंसक के बीच कुछ बुनियादी अंतरों को देखें
तुलना चार्ट:
तुलना के लिए आधार | निर्माता | नाशक |
---|---|---|
उद्देश्य | यह किसी ऑब्जेक्ट को मेमोरी आवंटित करता है। | यह किसी वस्तु की मेमोरी को हटाता है। |
घोषणा | class_name (तर्क यदि कोई हो) {}; | ~ class_name (कोई तर्क नहीं) {}; |
तर्क | कंस्ट्रक्टर तर्क को स्वीकार करता है | विध्वंसक किसी भी तर्क को स्वीकार नहीं करता है। |
कॉलिंग | कंस्ट्रक्टर को स्वचालित रूप से कहा जाता है, जबकि ऑब्जेक्ट बनाया जाता है। | विध्वंसक को स्वचालित रूप से कहा जाता है, क्योंकि ब्लॉक से बाहर निकल जाता है या प्रोग्राम समाप्त हो जाता है। |
काम कर रहे | कंस्ट्रक्टर ऑब्जेक्ट को इसके पहले कुछ मूल्य को इनिशियलाइज़ करने की अनुमति देता है, इसका उपयोग किया जाता है। | विनाशकर्ता वस्तु को उसके विनाश के समय किसी कोड को निष्पादित करने की अनुमति देता है। |
फाँसी का आदेश | कंस्ट्रक्टर को क्रमिक क्रम में कहा जाता है। | विध्वंसक को निर्माणकर्ता के रिवर्स ऑर्डर में कहा जाता है। |
संख्या में | क्लास में कई कंस्ट्रक्टर हो सकते हैं। | लेकिन कक्षा में हमेशा एक ही विध्वंसक होता है। |
कापी कंस्ट्रक्टर | कॉपी कंस्ट्रक्टर एक कंस्ट्रक्टर को किसी ऑब्जेक्ट को दूसरे ऑब्जेक्ट से घोषित करने और इनिशियलाइज़ करने की अनुमति देता है। | ऐसी कोई अवधारणा नहीं। |
ओवर लोडिंग | कन्स्ट्रक्टर्स को ओवरलोड किया जा सकता है। | विध्वंसक अतिभारित नहीं किया जा सकता है। |
कंस्ट्रक्टर की परिभाषा:
एक निर्माता मूल रूप से वर्ग का एक सदस्य कार्य है, जो ऑब्जेक्ट को इनिशियलाइज़ करता है और इसे मेमोरी आवंटित करता है। कन्स्ट्रक्टर्स को आसानी से पहचाना जा सकता है क्योंकि उन्हें घोषित किया गया है और उसी नाम से परिभाषित किया गया है जो क्लास के समान है। एक निर्माता के पास कोई वापसी प्रकार नहीं है; इसलिए, वे कुछ भी नहीं लौटाते हैं, 'शून्य' भी नहीं। एक निर्माता हमेशा एक वर्ग के सार्वजनिक अनुभाग में परिभाषित किया जाता है।
एक कक्षा में कई निर्माता हो सकते हैं; पारित किए गए तर्कों और प्रकारों के आधार पर उन्हें प्रतिष्ठित किया जा सकता है। यदि एक वर्ग में कई निर्माता हैं; निहित निर्माणकर्ता (कुछ भी नहीं निर्माता) को उनके साथ परिभाषित किया जाना चाहिए; यह कुछ नहीं करता है, लेकिन संकलक को संतुष्ट करता है।
कन्स्ट्रक्टर्स को डिफॉल्ट तर्कों के साथ भी परिभाषित किया जा सकता है। जबकि, वे ऑब्जेक्ट को "डायनामिकली" भी इनिशियलाइज़ करते हैं। कंस्ट्रक्टर्स को न तो विरासत में मिला जा सकता है, न ही यह वर्चुअल हो सकता है लेकिन, इन्हें ओवरलोड किया जा सकता है। उन्हें उनके पते पर नहीं भेजा जा सकता है।
निर्माणकर्ता का कार्यान्वयन:
वर्ग कास्ट {int a, b; सार्वजनिक: कॉन्स्ट () {// कंस्ट्रक्टर जिसका कोई पैरामीटर नहीं है a = 0; ख = 0; } कॉन्सट (इंट सी, इंट डी) {// कंस्ट्रक्टर पैरामीटर के साथ ए = सी; ग = घ; }}; int main () {const C1; सी 2 (10, 20); // यह कथन निर्माता को आमंत्रित करता है}
जब C1 का निर्माण किया जाता है तो कोई भी पैरामीटर निष्पादित नहीं होता है, क्योंकि C1 किसी भी पैरामीटर को पारित नहीं करता है। जबकि, जब C2 बनाया जाता है तो पैरामीटर के साथ एक कंस्ट्रक्टर निष्पादित होता है, क्योंकि यह कंस्ट्रक्टर को दो पूर्णांक पास कर रहा है।
विध्वंसक की परिभाषा:
एक विध्वंसक एक वर्ग का एक सदस्य कार्य भी है, जो किसी वस्तु को आवंटित स्मृति से निपटता है। इसे उसी नाम से परिभाषित किया जाता है, जो किसी वर्ग (t) (~) प्रतीक से पहले होता है। विध्वंसक को हमेशा निर्माणकर्ताओं के रिवर्स ऑर्डर में कहा जाता है।
एक वर्ग में हमेशा एक ही विध्वंसक होता है, क्योंकि वह किसी भी तर्क को स्वीकार नहीं करता है। जैसे ही निष्पादन के नियंत्रण ब्लॉक को हटाता है स्थानीय वस्तुएं नष्ट हो जाती हैं; दूसरी ओर, जब संपूर्ण कार्यक्रम समाप्त हो जाता है तो वैश्विक वस्तुएं नष्ट हो जाती हैं। एक संहारक को संकलक द्वारा संकलित किया जाता है। यदि कक्षाएं विरासत में मिली हैं, और एक वर्ग माता-पिता की श्रेणी से लिया गया है और दोनों बच्चे वर्ग और एक माता-पिता वर्ग में विनाशकारी हैं; फिर, व्युत्पन्न वर्ग के विध्वंसक को पहले कहा जाता है, उसके बाद मूल वर्ग के विध्वंसक को।
विध्वंसक का कार्यान्वयन:
वर्ग कास्ट {int a, b; सार्वजनिक: Const (int c, int d) {// पैरामीटर वाला कंस्ट्रक्टर। एक = c; ग = घ; cout << "a और b का मान है" <जब C1 ऑब्जेक्ट बनाया जाता है, तो पूर्णांक प्रकार के दो मापदंडों के साथ एक निर्माणकर्ता को आमंत्रित किया जाता है और सदस्य "ए, बी" को आरंभिक नाड मिलता है "ए, बी" के मूल्य मुद्रित होते हैं। उसके बाद विध्वंसक को निमंत्रण मिलता है और "ऑब्जेक्ट C1 नष्ट हो जाता है" संदेश को प्रिंट करें।
कंस्ट्रक्टर्स और डिस्ट्रक्टर्स के बीच महत्वपूर्ण अंतर
- एक निर्माता का मुख्य उद्देश्य वस्तुओं को स्मृति आवंटित करना है जब वे बनाए जाते हैं, जबकि एक विध्वंसक का मुख्य उद्देश्य वस्तु के स्मृति को नष्ट होने पर नष्ट करना है।
- एक रचनाकार को तर्कों को स्वीकार करने की अनुमति दी जाती है क्योंकि तर्क का उपयोग कक्षा के डेटा सदस्यों को आरंभ करने के लिए किया जा सकता है। एक विध्वंसक किसी भी तर्क को स्वीकार नहीं करता है क्योंकि उसका एकमात्र काम वस्तु की स्मृति को नष्ट करना है।
- जब किसी ऑब्जेक्ट का निर्माण किया जाता है तो कंस्ट्रक्टर को कहा जाता है दूसरी ओर, एक विध्वंसक को कहा जाता है जब कोई कार्यक्रम समाप्त होता है या प्रोग्राम उस ब्लॉक से बाहर निकलता है जिसमें ऑब्जेक्ट बनाया जाता है।
- एक कंस्ट्रक्टर का उपयोग आम तौर पर वर्ग के डेटा सदस्यों को आरंभ करने के लिए किया जाता है, जबकि एक विध्वंसक का उपयोग ऑब्जेक्ट को नष्ट होने से पहले कुछ क्रिया करने के लिए किया जाता है।
- कंस्ट्रक्टर्स को क्रमिक क्रम में निष्पादित किया जाता है, जिसका अर्थ है कि यदि कोई व्युत्पन्न वर्ग है जो बेस क्लास को विरासत में मिला है और व्युत्पन्न वर्ग का ऑब्जेक्ट बनाया गया है, तो वह बेस क्लास के कंस्ट्रक्टर को पहले और फिर व्युत्पन्न वर्ग के कंस्ट्रक्टर को कॉल करेगा। दूसरी ओर, व्युत्पन्न वर्ग के विध्वंसक को पहले कहा जाता है और फिर आधार वर्ग का अर्थ है कि विध्वंसक को निर्माणकर्ता के रिवर्स ऑर्डर में निष्पादित किया जाता है।
- क्लास में, कई कंस्ट्रक्टर हो सकते हैं, जो पास किए गए तर्कों से पहचाने जाते हैं। कक्षा में, केवल एक विध्वंसक है।
- कॉपी कंस्ट्रक्टर की एक अवधारणा है जो एक ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट से आरंभ करने की अनुमति देता है, जबकि, विध्वंसक के पास ऐसी कोई अवधारणा नहीं है।
- कंस्ट्रक्टर्स एक ही कंस्ट्रक्टर के नाम के तहत अलग-अलग एक्शन करने के लिए ओवरलोड हो सकते हैं जबकि, डिस्ट्रक्टर्स को ओवरलोड नहीं किया जा सकता है।
निष्कर्ष:
समानता के अलावा, वह निर्माता और विध्वंसक एक वर्ग का विशेष सदस्य कार्य है, और एक ही नाम के अधिकारी हैं, उन दोनों के बीच बुनियादी अंतर है, 'निर्माण' को स्मृति आवंटन के समय कहा जाता है और 'विध्वंसक' कहा जाता है वस्तुओं की स्मृति का समय। कंस्ट्रक्टर और विध्वंसक दोनों को संकलक द्वारा संकलित किया जाता है, भले ही वे वर्ग में परिभाषित न हों।