डिफ़ॉल्ट कंस्ट्रक्टर: Difference between revisions
No edit summary |
(text) |
||
Line 1: | Line 1: | ||
कंप्यूटर [[प्रोग्रामिंग भाषा]]ओं में, '''डिफॉल्ट कंस्ट्रक्टर''' शब्द एक [[कंस्ट्रक्टर (कंप्यूटर विज्ञान)]] को संदर्भित कर सकता है जो किसी भी प्रोग्रामर-परिभाषित कंस्ट्रक्टर (जैसे जावा में) की अनुपस्थिति में कंपाइलर द्वारा स्वचालित रूप से उत्पन्न होता है, और सामान्यतः एक नल्लरी कंस्ट्रक्टर होता है। अन्य भाषाओं में (उदाहरण के लिए C++ में) यह एक कंस्ट्रक्टर है जिसे बिना कोई आर्ग्युमेंट दिए कॉल किया जा सकता है, भले ही कंस्ट्रक्टर ऑटो-जेनरेट किया गया हो या यूजर-डिफाइंड हो। ध्यान दें कि | कंप्यूटर [[प्रोग्रामिंग भाषा]]ओं में, '''डिफॉल्ट कंस्ट्रक्टर''' शब्द एक [[कंस्ट्रक्टर (कंप्यूटर विज्ञान)]] को संदर्भित कर सकता है जो किसी भी प्रोग्रामर-परिभाषित कंस्ट्रक्टर (जैसे जावा में) की अनुपस्थिति में कंपाइलर द्वारा स्वचालित रूप से उत्पन्न होता है, और सामान्यतः एक नल्लरी कंस्ट्रक्टर होता है। अन्य भाषाओं में (उदाहरण के लिए C++ में) यह एक कंस्ट्रक्टर है जिसे बिना कोई आर्ग्युमेंट दिए कॉल किया जा सकता है, भले ही कंस्ट्रक्टर ऑटो-जेनरेट किया गया हो या यूजर-डिफाइंड हो। ध्यान दें कि फॉर्मल पैरामीटर्स [[पैरामीटर (कंप्यूटर विज्ञान)|(कंप्यूटर विज्ञान)]] वाले एक कंस्ट्रक्टर को अभी भी बिना आर्ग्युमेंट के कॉल किया जा सकता है यदि कंस्ट्रक्टर की परिभाषा में [[डिफ़ॉल्ट तर्क|डिफ़ॉल्ट आर्ग्युमेंट]] प्रदान किए गए थे। | ||
== [[सी++]] == | == [[सी++]] == | ||
Line 23: | Line 23: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
मेमोरी को डायनामिकलि अलोकेटेड करते समय, क्लास | मेमोरी को डायनामिकलि अलोकेटेड करते समय, क्लास नेम के बाद पैरेंथेसिस जोड़कर कंस्ट्रक्टर को कॉल किया जा सकता है। एक तरह से, यह कंस्ट्रक्टर के लिए एक एक्सप्लिसिट कॉल है: | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
int main() | int main() | ||
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</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> | ||
<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 116: | 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 11:06, 20 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)