त्रुटि संदेश स्पष्ट रूप से कहता है कि डिफ़ॉल्ट निर्माता को अंतर्निहित रूप से हटा दिया गया है । यह यहां तक कहता है कि क्यों: कक्षा में एक गैर-स्थैतिक, कास्ट वैरिएबल होता है, जिसे डिफ़ॉल्ट ctor द्वारा प्रारंभ नहीं किया जाएगा।
class X {
const int x;
};
के बाद से X::x
है const
, यह प्रारंभ किया जाना चाहिए - लेकिन कोई डिफ़ॉल्ट ctor सामान्य रूप से यह शुरू नहीं किया जा सकता है (क्योंकि यह एक पॉड प्रकार है)। इसलिए, डिफ़ॉल्ट ctor प्राप्त करने के लिए, आपको स्वयं को परिभाषित करने की आवश्यकता है (और इसे प्रारंभ करना होगा x
)। आप एक सदस्य के साथ एक ही तरह की स्थिति प्राप्त कर सकते हैं जो एक संदर्भ है:
class X {
whatever &x;
};
यह शायद ध्यान देने योग्य है कि ये दोनों एक असाइनमेंट ऑपरेटर के निहित निर्माण को भी अक्षम कर देंगे, अनिवार्य रूप से उसी कारण से। अंतर्निहित असाइनमेंट ऑपरेटर सामान्य रूप से सदस्य-वार असाइनमेंट करता है, लेकिन एक कॉन्स्टेबल सदस्य या संदर्भ सदस्य के साथ, ऐसा नहीं कर सकता क्योंकि सदस्य को असाइन नहीं किया जा सकता है। असाइनमेंट का काम करने के लिए, आपको अपना असाइनमेंट ऑपरेटर लिखना होगा।
यही कारण है कि एक const
सदस्य को आम तौर पर स्थिर होना चाहिए - जब आप एक असाइनमेंट करते हैं, तो आप वैसे भी कॉन्स्टेबल सदस्य को असाइन नहीं कर सकते। एक विशिष्ट मामले में आपके सभी उदाहरणों का मूल्य समान होने वाला है, इसलिए वे किसी एक चर की बहुत सारी प्रतियों के बजाय एक ही चर तक पहुंच साझा कर सकते हैं, जिसमें सभी का समान मूल्य होगा।
यह संभव है, बेशक, विभिन्न मूल्यों के साथ उदाहरण बनाने के लिए - आप (उदाहरण के लिए) जब आप ऑब्जेक्ट बनाते हैं तो एक मान पास करते हैं, इसलिए दो अलग-अलग वस्तुओं में दो अलग-अलग मूल्य हो सकते हैं। यदि, हालांकि, आप उन्हें स्वैप करने जैसा कुछ करने की कोशिश करते हैं, तो कास्ट सदस्य स्वैप किए जाने के बजाय अपने मूल मूल्य को बनाए रखेगा।