डिफ़ॉल्ट कंस्ट्रक्टर: Difference between revisions
(Created page with "कंप्यूटर प्रोग्रामिंग भाषाओं में, डिफॉल्ट कंस्ट्रक्टर शब्द एक ...") |
(text) |
||
Line 1: | Line 1: | ||
कंप्यूटर [[प्रोग्रामिंग भाषा]]ओं में, डिफॉल्ट कंस्ट्रक्टर शब्द एक [[कंस्ट्रक्टर (कंप्यूटर विज्ञान)]] को संदर्भित कर सकता है जो किसी भी प्रोग्रामर-परिभाषित कंस्ट्रक्टर (जैसे जावा में) की अनुपस्थिति में कंपाइलर द्वारा स्वचालित रूप से उत्पन्न होता है, और | कंप्यूटर [[प्रोग्रामिंग भाषा]]ओं में, '''डिफॉल्ट कंस्ट्रक्टर''' शब्द एक [[कंस्ट्रक्टर (कंप्यूटर विज्ञान)]] को संदर्भित कर सकता है जो किसी भी प्रोग्रामर-परिभाषित कंस्ट्रक्टर (जैसे जावा में) की अनुपस्थिति में कंपाइलर द्वारा स्वचालित रूप से उत्पन्न होता है, और सामान्यतः एक अशक्त कंस्ट्रक्टर होता है। अन्य भाषाओं में (उदाहरण के लिए C++ में) यह एक कंस्ट्रक्टर है जिसे बिना कोई तर्क दिए कॉल किया जा सकता है, भले ही कंस्ट्रक्टर ऑटो-जेनरेट किया गया हो या उपयोगकर्ता द्वारा परिभाषित हो। ध्यान दें कि औपचारिक [[पैरामीटर (कंप्यूटर विज्ञान)]] वाले एक कंस्ट्रक्टर को अभी भी बिना तर्क के कॉल किया जा सकता है यदि कंस्ट्रक्टर की परिभाषा में [[डिफ़ॉल्ट तर्क]] प्रदान किए गए थे। | ||
== [[सी++]] == | == [[सी++]] == | ||
[[सी++|सी]]++ में, मानक एक वर्ग के लिए डिफ़ॉल्ट कंस्ट्रक्टर को एक कंस्ट्रक्टर (कंप्यूटर विज्ञान) के रूप में वर्णित करता है जिसे बिना किसी तर्क के कहा जा सकता है (इसमें एक कंस्ट्रक्टर सम्मिलित है जिसके सभी मापदंडों में डिफ़ॉल्ट तर्क हैं)। <ref>C++ standard, ISO/IEC 14882:1998, 12.1.5<br />C++ standard, ISO/IEC 14882:2003, 12.1.5</ref> उदाहरण के लिए: | |||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
class MyClass | class MyClass | ||
Line 31: | Line 31: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
यदि कंस्ट्रक्टर के पास एक या अधिक पैरामीटर हैं, लेकिन उन सभी में डिफ़ॉल्ट मान हैं, तो यह अभी भी एक डिफ़ॉल्ट कंस्ट्रक्टर है। याद रखें कि प्रत्येक वर्ग में अधिकतम एक डिफ़ॉल्ट कंस्ट्रक्टर हो सकता है, या तो बिना पैरामीटर वाला, या वह जिसके सभी पैरामीटर में डिफ़ॉल्ट मान हों, जैसे कि इस | यदि कंस्ट्रक्टर के पास एक या अधिक पैरामीटर हैं, लेकिन उन सभी में डिफ़ॉल्ट मान हैं, तो यह अभी भी एक डिफ़ॉल्ट कंस्ट्रक्टर है। याद रखें कि प्रत्येक वर्ग में अधिकतम एक डिफ़ॉल्ट कंस्ट्रक्टर हो सकता है, या तो बिना पैरामीटर वाला, या वह जिसके सभी पैरामीटर में डिफ़ॉल्ट मान हों, जैसे कि इस स्तिथि में: | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
class MyClass | class MyClass | ||
Line 51: | Line 51: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[सी++|सी]]++ में, डिफ़ॉल्ट कंस्ट्रक्टर महत्वपूर्ण होते हैं क्योंकि वे कुछ परिस्थितियों में स्वचालित रूप से लागू हो जाते हैं; और इसलिए, इन परिस्थितियों में, किसी क्लास के लिए डिफ़ॉल्ट कंस्ट्रक्टर न होना एक त्रुटि है: | |||
* जब किसी ऑब्जेक्ट का मान बिना किसी तर्क सूची के घोषित किया जाता है (उदाहरण: <code>MyClass x;</code>) या बिना किसी तर्क सूची के गतिशील रूप से आवंटित (उदाहरण: <code>new MyClass;</code> या <code>new MyClass();</code>), का डिफ़ॉल्ट कंस्ट्रक्टर <code>MyClass</code> ऑब्जेक्ट को प्रारंभ करने के लिए उपयोग किया जाता है। | * जब किसी ऑब्जेक्ट का मान बिना किसी तर्क सूची के घोषित किया जाता है (उदाहरण: <code>MyClass x;</code>) या बिना किसी तर्क सूची के गतिशील रूप से आवंटित (उदाहरण: <code>new MyClass;</code> या <code>new MyClass();</code>), का डिफ़ॉल्ट कंस्ट्रक्टर <code>MyClass</code> ऑब्जेक्ट को प्रारंभ करने के लिए उपयोग किया जाता है। | ||
* जब वस्तुओं की एक सरणी घोषित की जाती है, उदा. <code>MyClass x[10];</code>; या गतिशील रूप से आवंटित, उदा. <code>new MyClass [10]</code> | * जब वस्तुओं की एक सरणी घोषित की जाती है, उदा. <code>MyClass x[10];</code>; या गतिशील रूप से आवंटित, उदा. <code>new MyClass [10]</code> का डिफ़ॉल्ट कंस्ट्रक्टर <code>MyClass</code> सभी तत्वों को आरंभ करने के लिए उपयोग किया जाता है। | ||
* जब एक व्युत्पन्न क्लास कंस्ट्रक्टर अपनी इनिशियलाइज़र सूची में बेस क्लास कंस्ट्रक्टर को स्पष्ट रूप से कॉल नहीं करता है, तो बेस क्लास के लिए डिफ़ॉल्ट कंस्ट्रक्टर को कॉल किया जाता है। | * जब एक व्युत्पन्न क्लास कंस्ट्रक्टर अपनी इनिशियलाइज़र सूची में बेस क्लास कंस्ट्रक्टर को स्पष्ट रूप से कॉल नहीं करता है, तो बेस क्लास के लिए डिफ़ॉल्ट कंस्ट्रक्टर को कॉल किया जाता है। | ||
* जब कोई क्लास कंस्ट्रक्टर अपनी इनिशियलाइज़र सूची में किसी ऑब्जेक्ट-वैल्यू फ़ील्ड के कंस्ट्रक्टर को स्पष्ट रूप से कॉल नहीं करता है, तो फ़ील्ड के क्लास के लिए डिफ़ॉल्ट कंस्ट्रक्टर को कॉल किया जाता है। | * जब कोई क्लास कंस्ट्रक्टर अपनी इनिशियलाइज़र सूची में किसी ऑब्जेक्ट-वैल्यू फ़ील्ड के कंस्ट्रक्टर को स्पष्ट रूप से कॉल नहीं करता है, तो फ़ील्ड के क्लास के लिए डिफ़ॉल्ट कंस्ट्रक्टर को कॉल किया जाता है। | ||
* मानक लाइब्रेरी में, कुछ कंटेनर डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग करके मान भरते हैं जब मान स्पष्ट रूप से नहीं दिया जाता है। जैसे <code>vector<nowiki><MyClass></nowiki>(10);</code> वेक्टर को दस तत्वों के साथ प्रारंभ करें, जो एक डिफ़ॉल्ट-कंस्ट्रक्टर | * मानक लाइब्रेरी में, कुछ कंटेनर डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग करके मान भरते हैं जब मान स्पष्ट रूप से नहीं दिया जाता है। जैसे <code>vector<nowiki><MyClass></nowiki>(10);</code>वेक्टर को दस तत्वों के साथ प्रारंभ करें, जो एक डिफ़ॉल्ट-कंस्ट्रक्टर <code>MyClass</code> से भरे हुए हैं । | ||
यदि किसी वर्ग में कोई स्पष्ट रूप से परिभाषित कंस्ट्रक्टर नहीं है, तो कंपाइलर इसके लिए एक डिफ़ॉल्ट कंस्ट्रक्टर को स्पष्ट रूप से घोषित और परिभाषित करेगा। यह अंतर्निहित रूप से परिभाषित डिफ़ॉल्ट कंस्ट्रक्टर एक खाली बॉडी वाले स्पष्ट रूप से परिभाषित कंस्ट्रक्टर के बराबर है। उदाहरण के लिए:<ref>Computer Science A Structured Approach Using C++ by Behrouz A. Forouzan and Richard F. Gilberg</ref> | यदि किसी वर्ग में कोई स्पष्ट रूप से परिभाषित कंस्ट्रक्टर नहीं है, तो कंपाइलर इसके लिए एक डिफ़ॉल्ट कंस्ट्रक्टर को स्पष्ट रूप से घोषित और परिभाषित करेगा। यह अंतर्निहित रूप से परिभाषित डिफ़ॉल्ट कंस्ट्रक्टर एक खाली बॉडी वाले स्पष्ट रूप से परिभाषित कंस्ट्रक्टर के बराबर है। उदाहरण के लिए: <ref>Computer Science A Structured Approach Using C++ by Behrouz A. Forouzan and Richard F. Gilberg</ref> | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
class MyClass | class MyClass | ||
Line 70: | Line 70: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
यदि किसी क्लास के लिए कंस्ट्रक्टर्स को स्पष्ट रूप से परिभाषित किया गया है, लेकिन वे सभी गैर-डिफ़ॉल्ट हैं, तो कंपाइलर किसी डिफॉल्ट कंस्ट्रक्टर को अंतर्निहित रूप से परिभाषित नहीं करेगा, जिससे ऐसी स्थिति | यदि किसी क्लास के लिए कंस्ट्रक्टर्स को स्पष्ट रूप से परिभाषित किया गया है, लेकिन वे सभी गैर-डिफ़ॉल्ट हैं, तो कंपाइलर किसी डिफॉल्ट कंस्ट्रक्टर को अंतर्निहित रूप से परिभाषित नहीं करेगा, जिससे ऐसी स्थिति उत्पन्न होगी जहां क्लास में डिफॉल्ट कंस्ट्रक्टर नहीं होगा। यह एक विशिष्ट त्रुटि का कारण है, जिसे निम्नलिखित उदाहरण द्वारा प्रदर्शित किया गया है। | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
class MyClass | class MyClass | ||
Line 94: | Line 94: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
चूंकि न तो प्रोग्रामर और न ही कंपाइलर ने डिफॉल्ट कंस्ट्रक्टर को परिभाषित किया है, | चूंकि न तो प्रोग्रामर और न ही कंपाइलर ने डिफॉल्ट कंस्ट्रक्टर को परिभाषित किया है,<code>p</code> द्वारा इंगित ओब्जेक्टेड पॉइंटेड से एरर उत्पन्न होता है। <ref>Computer Science A Structured Approach Using C++ by Behrouz A. Forouzan and Richard F. Gilberg</ref> | ||
दूसरी ओर C++11 में एक डिफ़ॉल्ट कंस्ट्रक्टर स्पष्ट रूप से बनाया जा सकता है: | दूसरी ओर C++11 में एक डिफ़ॉल्ट कंस्ट्रक्टर स्पष्ट रूप से बनाया जा सकता है: | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
Line 115: | Line 116: | ||
== जावा और सी# == | == जावा और सी# == | ||
[[जावा (प्रोग्रामिंग भाषा)]] और सी शार्प (प्रोग्रामिंग भाषा) | [[जावा (प्रोग्रामिंग भाषा)]] और सी शार्प (प्रोग्रामिंग भाषा) दोनों में, एक डिफ़ॉल्ट कंस्ट्रक्टर एक अशक्त कंस्ट्रक्टर को संदर्भित करता है जो कंपाइलर द्वारा स्वचालित रूप से उत्पन्न होता है यदि क्लास के लिए कोई कंस्ट्रक्टर परिभाषित नहीं किया गया है। डिफ़ॉल्ट कंस्ट्रक्टर स्पष्ट रूप से सुपरक्लास के नलरी कंस्ट्रक्टर को कॉल करता है, फिर एक खाली बॉडी निष्पादित करता है। सभी फ़ील्ड को उनके प्रारंभिक मान 0 (पूर्णांक प्रकार), 0.0 (फ़्लोटिंग-पॉइंट प्रकार) पर छोड़ दिया गया है। <code>false</code> (<code>boolean</code> प्रकार), या <code>null</code> (संदर्भ प्रकार), एक प्रोग्रामर-परिभाषित कंस्ट्रक्टर जो कोई पैरामीटर नहीं लेता है उसे सी शार्प (प्रोग्रामिंग भाषा) में डिफॉल्ट कंस्ट्रक्टर भी कहा जाता है, लेकिन जावा (प्रोग्रामिंग भाषा) में नहीं कहा जाता है। <ref>[http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.9 Java Language Specification, 3rd edition, section 8.8.9], "Default Constructor".</ref><ref>[http://msdn.microsoft.com/en-us/library/ms173115(v=vs.80).aspx#MSDN Using Constructors (C# Programming Guide)]</ref> | ||
Revision as of 23:22, 17 July 2023
कंप्यूटर प्रोग्रामिंग भाषाओं में, डिफॉल्ट कंस्ट्रक्टर शब्द एक कंस्ट्रक्टर (कंप्यूटर विज्ञान) को संदर्भित कर सकता है जो किसी भी प्रोग्रामर-परिभाषित कंस्ट्रक्टर (जैसे जावा में) की अनुपस्थिति में कंपाइलर द्वारा स्वचालित रूप से उत्पन्न होता है, और सामान्यतः एक अशक्त कंस्ट्रक्टर होता है। अन्य भाषाओं में (उदाहरण के लिए 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]
संदर्भ
- ↑ 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)