डिफ़ॉल्ट कंस्ट्रक्टर

From Vigyanwiki

कंप्यूटर प्रोग्रामिंग लैंग्वेज में, डिफॉल्ट कंस्ट्रक्टर शब्द एक कंस्ट्रक्टर (कंप्यूटर विज्ञान) को संदर्भित कर सकता है जो किसी भी प्रोग्रामर-डिफाइंड कंस्ट्रक्टर (जैसे जावा में) की अनुपस्थिति में कंपाइलर द्वारा स्वचालित रूप से उत्पन्न होता है, और सामान्यतः एक नल्लरी कंस्ट्रक्टर होता है। अन्य लैंग्वेज में (उदाहरण के लिए C++ में) यह एक कंस्ट्रक्टर है जिसे बिना कोई आर्ग्युमेंट दिए कॉल किया जा सकता है, भले ही कंस्ट्रक्टर ऑटो-जेनरेट किया गया हो या यूजर-डिफाइंड हो। ध्यान दें कि फॉर्मल पैरामीटर्स (कंप्यूटर विज्ञान) वाले एक कंस्ट्रक्टर को अभी भी बिना आर्ग्युमेंट के कॉल किया जा सकता है यदि कंस्ट्रक्टर की परिलैंग्वेज में डिफ़ॉल्ट आर्ग्युमेंट प्रदान किए गए थे।

सी++

सी++ में, मानक एक वर्ग के लिए डिफ़ॉल्ट कंस्ट्रक्टर को एक कंस्ट्रक्टर (कंप्यूटर विज्ञान) के रूप में वर्णित करता है जिसे बिना किसी आर्ग्युमेंट के कहा जा सकता है (इसमें एक कंस्ट्रक्टर सम्मिलित है जिसके सभी मापदंडों में डिफ़ॉल्ट आर्ग्युमेंट हैं)। [1] उदाहरण के लिए:

class MyClass
{
public:
    MyClass();  // constructor declared

private:
    int x;
};

MyClass::MyClass() : x(100)  // constructor defined
{
}

int main()
{
    MyClass m;  // at runtime, object m is created, and the default constructor is called
}

मेमोरी को डायनामिकलि अलोकेटेड करते समय, क्लास नेम के बाद पैरेंथेसिस जोड़कर कंस्ट्रक्टर को कॉल किया जा सकता है। एक तरह से, यह कंस्ट्रक्टर के लिए एक एक्सप्लिसिट कॉल है:

int main()
{
    MyClass * pointer = new MyClass();  // at runtime, an object is created, and the
                                        // default constructor is called
}

यदि कंस्ट्रक्टर के पास एक या अधिक पैरामीटर हैं, लेकिन उन सभी में डिफ़ॉल्ट वैल्यू हैं, तो यह अभी भी एक डिफ़ॉल्ट कंस्ट्रक्टर है। याद रखें कि प्रत्येक वर्ग में अधिकतम एक डिफ़ॉल्ट कंस्ट्रक्टर हो सकता है, या तो बिना पैरामीटर वाला, या वह जिसके सभी पैरामीटर में डिफ़ॉल्ट मान हों, जैसे कि इस स्तिथि में:

class MyClass
{
public:
    MyClass (int i = 0, std::string s = "");  // constructor declared

private:
    int x;
    int y;
    std::string z;
};

MyClass::MyClass(int i, std::string s)     // constructor defined
{
    x = 100;
    y = i;
    z = s;
}

सी++ में, डिफ़ॉल्ट कंस्ट्रक्टर महत्वपूर्ण होते हैं क्योंकि वे कुछ परिस्थितियों में स्वचालित रूप से लागू हो जाते हैं; और इसलिए, इन परिस्थितियों में, किसी क्लास के लिए डिफ़ॉल्ट कंस्ट्रक्टर न होना एक एरर है:

  • जब किसी ऑब्जेक्ट का मान बिना किसी आर्ग्युमेंट सूची के घोषित किया जाता है (उदाहरण: MyClass x;) या बिना किसी आर्ग्युमेंट लिस्ट के डायनामिकलि अलोकेटेड (उदाहरण: new MyClass; या new MyClass();), का डिफ़ॉल्ट कंस्ट्रक्टर MyClass ऑब्जेक्ट को प्रारंभ करने के लिए उपयोग किया जाता है।
  • जब वस्तुओं का एक ऐरे घोषित किया जाता है, उदा. MyClass x[10]; या डायनामिकलि अलोकेटेड, उदा. new MyClass [10] का डिफ़ॉल्ट कंस्ट्रक्टर MyClass सभी तत्वों को इनिशियलाइज़ करने के लिए उपयोग किया जाता है।
  • जब एक व्युत्पन्न क्लास कंस्ट्रक्टर अपनी इनिशियलाइज़र सूची में बेस क्लास कंस्ट्रक्टर को स्पष्ट रूप से कॉल नहीं करता है, तो बेस क्लास के लिए डिफ़ॉल्ट कंस्ट्रक्टर को कॉल किया जाता है।
  • जब कोई क्लास कंस्ट्रक्टर अपनी इनिशियलाइज़र सूची में किसी ऑब्जेक्ट-वैल्यू फ़ील्ड के कंस्ट्रक्टर को स्पष्ट रूप से कॉल नहीं करता है, तो फ़ील्ड के क्लास के लिए डिफ़ॉल्ट कंस्ट्रक्टर को कॉल किया जाता है।
  • स्टैण्डर्ड लाइब्रेरी में, कुछ कंटेनर डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग करके वैल्यू भरते हैं जब वैल्यू स्पष्ट रूप से नहीं दी जाती है। जैसे vector<MyClass>(10);वेक्टर को दस एलिमेंट के साथ इनिशियलाइज़ करें, जो एक डिफ़ॉल्ट-कंस्ट्रक्टर MyClass से भरे हुए हैं ।

यदि किसी वर्ग में कोई स्पष्ट रूप से परिभाषित कंस्ट्रक्टर नहीं है, तो कंपाइलर इसके लिए एक डिफ़ॉल्ट कंस्ट्रक्टर को स्पष्ट रूप से घोषित और परिभाषित करेगा। यह इम्प्लीसिटली डिफाइंड डिफ़ॉल्ट कंस्ट्रक्टर एक एम्प्टी बॉडी वाले स्पष्ट रूप से परिभाषित कंस्ट्रक्टर के बराबर है। उदाहरण के लिए: [2]

class MyClass
{
    int x;  // no constructor, so the compiler produces an (implicit) default constructor
};

int main()
{
    MyClass m;   // no error at runtime: the (implicit) default constructor is called
}

यदि किसी क्लास के लिए कंस्ट्रक्टर्स को स्पष्ट रूप से परिभाषित किया गया है, लेकिन वे सभी नॉन-डिफ़ॉल्ट हैं, तो कंपाइलर किसी डिफॉल्ट कंस्ट्रक्टर को इम्प्लीसिटली परिभाषित नहीं करेगा, जिससे ऐसी स्थिति उत्पन्न होगी जहां क्लास में डिफॉल्ट कंस्ट्रक्टर नहीं होगा। यह एक टिपिकल एरर का कारण है, जिसे निम्नलिखित उदाहरण द्वारा प्रदर्शित किया गया है।

class MyClass
{
public:
    MyClass (int y);  // declaration a non-default constructor

private:
    int x;
};

MyClass::MyClass (int y)
{
    x = y;
}

int main()
{
    MyClass m(100);     // the non-default constructor is called
    MyClass * p;        // for pointer declarations, the compiler does not need to know about constructors
    p = new MyClass();  // error at compilation: no default constructor
    return 0;
}

चूंकि न तो प्रोग्रामर और न ही कंपाइलर ने डिफॉल्ट कंस्ट्रक्टर को परिभाषित किया है,p द्वारा इंगित ओब्जेक्टेड पॉइंटेड से एरर उत्पन्न होता है। [3]

दूसरी ओर C++11 में एक डिफ़ॉल्ट कंस्ट्रक्टर स्पष्ट रूप से बनाया जा सकता है:

class MyClass
{
public:
    MyClass () = default;  // force generation of a default constructor
};

या स्पष्ट रूप से बाधित:

class MyClass
{
public:
    MyClass () = delete;  // prevent generation of default constructor
};


जावा और सी#

जावा (प्रोग्रामिंग लैंग्वेज) और सी शार्प (प्रोग्रामिंग लैंग्वेज) दोनों में, एक डिफ़ॉल्ट कंस्ट्रक्टर एक नल्लरी कंस्ट्रक्टर को संदर्भित करता है जो कंपाइलर द्वारा स्वचालित रूप से उत्पन्न होता है यदि क्लास के लिए कोई कंस्ट्रक्टर परिभाषित नहीं किया गया है। डिफ़ॉल्ट कंस्ट्रक्टर स्पष्ट रूप से सुपरक्लास के नलरी कंस्ट्रक्टर को कॉल करता है, फिर एक एम्प्टी बॉडी एक्सेक्यूट करता है। सभी फ़ील्ड को उनके प्रारंभिक मान 0 (पूर्णांक प्रकार), 0.0 (फ़्लोटिंग-पॉइंट प्रकार) पर छोड़ दिया गया है। false (boolean प्रकार), या null (संदर्भ प्रकार), एक प्रोग्रामर-परिभाषित कंस्ट्रक्टर जो कोई पैरामीटर नहीं लेता है उसे सी शार्प (प्रोग्रामिंग लैंग्वेज) में डिफॉल्ट कंस्ट्रक्टर भी कहा जाता है, लेकिन जावा (प्रोग्रामिंग लैंग्वेज) में नहीं कहा जाता है। [4][5]


संदर्भ

  1. C++ standard, ISO/IEC 14882:1998, 12.1.5
    C++ standard, ISO/IEC 14882:2003, 12.1.5
  2. Computer Science A Structured Approach Using C++ by Behrouz A. Forouzan and Richard F. Gilberg
  3. Computer Science A Structured Approach Using C++ by Behrouz A. Forouzan and Richard F. Gilberg
  4. Java Language Specification, 3rd edition, section 8.8.9, "Default Constructor".
  5. Using Constructors (C# Programming Guide)