2013-05-23 18 views
5

युक्त कक्षा के लिए डिफ़ॉल्ट कन्स्ट्रक्टर मौजूद नहीं है क्यों निरंतर डेटा सदस्यों वाले वर्ग के लिए संकलक द्वारा डिफ़ॉल्ट कन्स्ट्रक्टर जोड़ा नहीं जाता है। कृपया नीचे दिए गए कोड को देखें, जिसमें मैंने निरंतर डेटा सदस्य 'ए' घोषित किया है और कक्षा 'कक्षा' के लिए ऑब्जेक्ट बनाने की कोशिश करते समय यह कह रहा है कि कोई उचित डिफ़ॉल्ट कन्स्ट्रक्टर उपलब्ध नहीं है। कृपया मदद करे।क्यों कॉन्स्ट डेटा सदस्यों

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

class ClassA 
{ 
    private: 
    const int a; 
    public : 
    void print() 
    { 
     cout << "hello world" << endl; 
    } 
}; 

int main() 
{ 
    ClassA obj; 
    obj.print(); 
    return 0; 
} 
+4

आपको 'ए' आरंभ करना होगा। – chris

+0

अन्यत्र टिप्पणियों के बावजूद, 'ए' के लिए स्पष्ट प्रारंभिकरण प्रारंभिक प्रारंभकर्ता, अर्थात्' int() 'है, जो शून्य के साथ आरंभ होगा। हां, यह (लगभग) व्यर्थ है, लेकिन क्या किसी के पास कोई संदर्भ है कि डिफ़ॉल्ट कन्स्ट्रक्टर के लिए यह क्यों संभव नहीं है? – Keith

+0

@ किथ यह सिर्फ भाषा का एक विकल्प है। अंतर्निहित डेटा सदस्यों को डिफ़ॉल्ट रूप से प्रारंभ नहीं किया जाता है। – juanchopanza

उत्तर

2

के बाद यह आरंभ नहीं हो जाता है कि कैसे एक डिफ़ॉल्ट निर्माता इसके लिए एक मूल्य के लिए चुन सकते हैं के बाद से एक स्थिरांक मूल्य नहीं बदल सकते। तो डिफ़ॉल्ट कन्स्ट्रक्टर

0

मेरा मानना ​​है कि आपको कन्स्ट्रक्टर में कॉन्स सदस्यों को स्पष्ट रूप से प्रारंभ करना होगा, आपको उन्हें कहीं भी सेट करना होगा, और जैसे ही वे हैं, आप इसे कहीं भी सेट कर सकते हैं!

2

a के बाद से, है, आप इसे के रूप में स्थिर घोषणा कर सकते हैं और प्रारंभ में यह है, इस प्रकार एक निर्माता का उपयोग किए बिना,

class ClassA 
{ 
    private: 
    const static int a=10; 
    public : 
    void print() 
    { 
     cout << "hello world" << endl; 
    } 
}; 

int main() 
{ 
    ClassA obj; 
    obj.print(); 
    return 0; 
} 
1

प्रकार int सी या सी में एक डिफ़ॉल्ट मान नहीं है ++ एक const चर रहा है इसलिए a का मान अपरिभाषित होगा। उदाहरण के लिए, वीसी ++ a के मान को एक अलग डिफ़ॉल्ट मान के साथ पॉप्युलेट करेगा यदि यह रिलीज मोड में चलाए जाने पर डीबग में चलाया जाता है।

निम्न मानों के साथ

डिबग में, कुलपति ++ populates uninitialized memory:

  • 0xCCCCCCCC - माइक्रोसॉफ्ट के सी ++ क्रम पुस्तकालय और कई डॉस वातावरण डिबगिंग अप्रारंभीकृत ढेर स्मृति को चिह्नित करने के द्वारा प्रयुक्त।
  • 0xCDCDCDCD - a अपने कार्यक्रम आरंभ नहीं द्वारा अप्रारंभीकृत ढेर स्मृति, आमतौर पर HeapAlloc (से लौटे)

चिह्नित करने के लिए तो माइक्रोसॉफ्ट के C/C++ डिबग malloc() समारोह द्वारा प्रयुक्त एक अलग स्थिरांक मूल्य प्रत्येक होगा पहर।

4

सी ++ 03 नियम 12.6.2/4 [class.base.init] में निर्दिष्ट किया गया था। यदि किसी कन्स्ट्रक्टर की सदस्य प्रारंभकर्ता सूची में किसी वर्ग के गैर-स्थैतिक सदस्य का उल्लेख नहीं किया गया था, तो यदि यह const योग्य था तो उसे उपयोगकर्ता द्वारा घोषित कन्स्ट्रक्टर के साथ एक गैर-पीओडी कक्षा प्रकार होना होगा अन्यथा कार्यक्रम बीमार होगा -formed। एक स्पष्ट रूप से परिभाषित कन्स्ट्रक्टर को एक खाली सदस्य प्रारंभकर्ता सूची (और खाली निकाय) के साथ परिभाषित किया जाता है, इसलिए, इस मामले में, निहित रूप से घोषित डिफ़ॉल्ट कन्स्ट्रक्टर को स्पष्ट रूप से परिभाषित करने के कारण यह प्रोग्राम खराब तरीके से प्रस्तुत करेगा।

सी ++ 11 नियम एक ही चीज़ के बराबर है। गैर-स्थैतिक डेटा सदस्य जो सदस्य प्रारंभकर्ता सूची में निर्दिष्ट नहीं हैं डिफ़ॉल्ट प्रारंभिक हैं। सी ++ 11 8.5/6 [dcl.init] में, "[...] यदि कोई प्रोग्राम किसी कॉन्स्ट-क्वालिफाइड प्रकार T, T के किसी ऑब्जेक्ट के डिफ़ॉल्ट प्रारंभ के लिए कॉल करता है, तो उपयोगकर्ता द्वारा प्रदत्त उपयोगकर्ता के साथ एक क्लास प्रकार होगा डिफ़ॉल्ट कन्स्ट्रक्टर। " जो इस मामले में एक ही नियम के लिए उबलता है।

+0

+1। – Keith

संबंधित मुद्दे