संपादित करें। वास्तव में, जबकि मैं अपने पहले उत्तर में जो कहता हूं वह मान्य है, यही वास्तविक कारण है।
शुरुआत में सी। सी। ऑब्जेक्ट-ओरिएंटेड नहीं था (आप एक ओओ दृष्टिकोण ले सकते हैं, लेकिन यह आपकी मदद नहीं करता है या कुछ भी लागू नहीं करता है)।
तब सी विथ क्लासेस था, जिसे बाद में सी ++ नाम दिया गया था। C ++ ऑब्जेक्ट-ओरिएंटेड है, और इसलिए एनकैप्सुलेशन को प्रोत्साहित करता है, और किसी ऑब्जेक्ट के अपरिवर्तन को सुनिश्चित करता है - किसी भी विधि के आरंभ और अंत में, ऑब्जेक्ट एक मान्य स्थिति में है।
इसके साथ स्वाभाविक बात यह है कि, यह सुनिश्चित करने के लिए एक वर्ग हमेशा एक निर्माता होना चाहिए कि यह एक वैध स्थिति में शुरू हो - अगर कंस्ट्रक्टर को यह सुनिश्चित करने के लिए कुछ भी करने की ज़रूरत नहीं है, तो खाली निर्माता इस तथ्य का दस्तावेजीकरण करेगा। ।
लेकिन सी ++ के साथ एक लक्ष्य सी के साथ संगत होना था कि जितना संभव हो सके, सभी वैध सी प्रोग्राम भी मान्य थे सी ++ प्रोग्राम (अब सक्रिय लक्ष्य के रूप में नहीं है, और सी ++ के अलग-अलग विकास का मतलब है कि यह अब नहीं रखता है। )।
इसका एक प्रभाव कार्यक्षमता के बीच struct
और में दोहराव था class
। पूर्व करने वाली चीजें C रास्ता (सब कुछ सार्वजनिक रूप से डिफ़ॉल्ट) और बाद में कर रही चीजें अच्छे OO तरीके से (सब कुछ डिफ़ॉल्ट रूप से निजी, डेवलपर सक्रिय रूप से सार्वजनिक करता है कि वे क्या चाहते हैं)।
एक और यह है कि एक सी के लिए struct
, जिसमें एक कंस्ट्रक्टर नहीं हो सकता है क्योंकि सी में कंस्ट्रक्टर नहीं हैं, सी ++ में मान्य हैं, फिर इसे देखने के लिए सी ++ के लिए एक अर्थ होना चाहिए। और इसलिए, जब एक कंस्ट्रक्टर नहीं होता है, तो यह सुनिश्चित करता है कि ओ ओ प्रैक्टिस को सुनिश्चित करने के लिए सक्रिय रूप से एक अशुभ सुनिश्चित करता है, सी ++ ने इसका मतलब यह निकाला कि एक डिफ़ॉल्ट पैरामीटर रहित कंस्ट्रक्टर था जो काम करता था जैसे यह एक खाली शरीर था।
सभी C structs
अब वैध C ++ थे structs
, (जिसका अर्थ था कि वे C ++ जैसे ही classes
सब कुछ हैं - सदस्य और विरासत - जनता) बाहर से इलाज किया जाता है जैसे कि यह एक एकल, पैरामीटर रहित निर्माता था।
यदि फिर भी आपने एक class
या एक कंस्ट्रक्टर को रखा है struct
, तो आप सी के बजाय C ++ / OO तरीके से काम कर रहे थे, और डिफ़ॉल्ट कंस्ट्रक्टर की कोई आवश्यकता नहीं थी।
चूंकि यह एक आशुलिपि के रूप में कार्य करता था, इसलिए लोग इसका उपयोग तब भी करते रहे जब संगतता संभव नहीं थी (यह अन्य C ++ सुविधाओं का उपयोग C में नहीं)।
इसलिए जब जावा साथ आया (कई तरह से C ++ पर आधारित) और बाद में C # (C ++ और जावा पर अलग-अलग तरीकों से आधारित), तो उन्होंने इस दृष्टिकोण को रखा क्योंकि कुछ कोडरों का उपयोग पहले से ही किया जा सकता है।
स्ट्रॉस्ट्रुप इस बारे में अपनी C ++ प्रोग्रामिंग लैंग्वेज में लिखते हैं और इससे भी ज्यादा, द डिजाइन एंड इवोल्यूशन ऑफ C ++ में लैंग्वेज के "whys" पर ज्यादा फोकस करते हैं ।
=== मूल उत्तर ===
मान लीजिए कि ऐसा नहीं हुआ।
मान लीजिए कि मैं एक पैरामीटर रहित निर्माता नहीं चाहता, क्योंकि मैं अपनी कक्षा को एक के बिना एक सार्थक स्थिति में नहीं डाल सकता। वास्तव में, यह कुछ ऐसा है struct
जो C # में हो सकता है (लेकिन यदि आप C # में ऑल-जीरो-एंड-नल्स का सार्थक उपयोग नहीं कर सकते हैं तो आप struct
गैर-सार्वजनिक रूप से दृश्यमान अनुकूलन का उपयोग कर सकते हैं, और अन्यथा एक उपयोग में डिजाइन दोष struct
)।
अपने वर्ग को अपने आक्रमणकारियों से बचाने में सक्षम बनाने के लिए, मुझे एक विशेष removeDefaultConstructor
खोजशब्द की आवश्यकता है । बहुत कम से कम, मुझे यह सुनिश्चित करने के लिए एक निजी पैरामीटर रहित कंस्ट्रक्टर बनाने की आवश्यकता होगी कि कोई कॉलिंग कोड डिफ़ॉल्ट न हो।
जो भाषा को कुछ और उलझा देता है। बेहतर है कि इसे न करें।
सभी में, डिफॉल्ट को हटाने के रूप में एक कंस्ट्रक्टर को जोड़ने के बारे में सोचना सबसे अच्छा है, बेहतर है कि कोई भी कंस्ट्रक्टर चीनी को एक पैरामीटर रहित कंस्ट्रक्टर को जोड़ने के लिए बिल्कुल भी कोई कंस्ट्रक्टर न होने के बारे में सोचें जो कुछ भी नहीं करता है।