डिफ़ॉल्ट कंस्ट्रक्टर
कंप्यूटर प्रोग्रामिंग भाषाओं में, डिफॉल्ट कंस्ट्रक्टर शब्द एक कंस्ट्रक्टर (कंप्यूटर विज्ञान) को संदर्भित कर सकता है जो किसी भी प्रोग्रामर-परिभाषित कंस्ट्रक्टर (जैसे जावा में) की अनुपस्थिति में कंपाइलर द्वारा स्वचालित रूप से उत्पन्न होता है, और आमतौर पर एक अशक्त कंस्ट्रक्टर होता है। अन्य भाषाओं में (उदाहरण के लिए C++ में) यह एक कंस्ट्रक्टर है जिसे बिना कोई तर्क दिए कॉल किया जा सकता है, भले ही कंस्ट्रक्टर ऑटो-जेनरेट किया गया हो या उपयोगकर्ता द्वारा परिभाषित हो। ध्यान दें कि औपचारिक पैरामीटर (कंप्यूटर विज्ञान) वाले एक कंस्ट्रक्टर को अभी भी बिना तर्क के कॉल किया जा सकता है यदि कंस्ट्रक्टर की परिभाषा में डिफ़ॉल्ट तर्क प्रदान किए गए थे।
सी++
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;
}
C++ में, डिफ़ॉल्ट कंस्ट्रक्टर महत्वपूर्ण होते हैं क्योंकि वे कुछ परिस्थितियों में स्वचालित रूप से लागू हो जाते हैं; और इसलिए, इन परिस्थितियों में, किसी क्लास के लिए डिफ़ॉल्ट कंस्ट्रक्टर न होना एक त्रुटि है:
- जब किसी ऑब्जेक्ट का मान बिना किसी तर्क सूची के घोषित किया जाता है (उदाहरण:
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]
संदर्भ
- ↑ C++ standard, ISO/IEC 14882:1998, 12.1.5
C++ standard, ISO/IEC 14882:2003, 12.1.5 - ↑ Computer Science A Structured Approach Using C++ by Behrouz A. Forouzan and Richard F. Gilberg
- ↑ Computer Science A Structured Approach Using C++ by Behrouz A. Forouzan and Richard F. Gilberg
- ↑ Java Language Specification, 3rd edition, section 8.8.9, "Default Constructor".
- ↑ Using Constructors (C# Programming Guide)