2010-12-08 14 views
11

सी ++ 98भ्रम ++ मानकों

12.6.2/4 में: दसवीं कक्षा के लिए एक निर्माता के लिए कॉल पूर्ण होने के बाद, एक्स के एक सदस्य न में निर्दिष्ट किया जाता है, तो निर्माता की मेम-प्रारंभिक, न ही डिफ़ॉल्ट-प्रारंभिक, और न ही निर्माता के शरीर के निष्पादन के दौरान आरंभ किया गया, सदस्य का अनिश्चित मूल्य है।

क्या और न ही निर्माता के शरीर के निष्पादन के दौरान प्रारंभ मतलब है? क्या सदस्य कन्स्ट्रक्टर के शरीर के अंदर प्रारंभ कर सकता है?

उत्तर

11

और न ही कन्स्ट्रक्टर के शरीर के निष्पादन के दौरान प्रारंभिक आईएमएचओ सही नहीं है।

शब्दों को से सी ++ 03 में बदल दिया गया है और न ही प्रारंभ (सी ++ 98 में) है और न ही एक मूल्य

दसवीं कक्षा के लिए एक निर्माता के लिए कॉल करने के बाद दिया पूरा कर लिया है , यदि एक्स का कोई सदस्य कन्स्ट्रक्टर के मेम-स्टार्टर्स में निर्दिष्ट नहीं है, न ही डिफ़ॉल्ट-प्रारंभिक, न ही मूल्य-प्रारंभिक, और कन्स्ट्रक्टर के शरीर के निष्पादन के दौरान मूल्य दिया गया है, तो सदस्य का अनिश्चित मूल्य है।

+0

मेरे पास सी ++ 03 की एक प्रति नहीं है। मैं इसे कहां से प्राप्त कर सकता हूं? – Bazinga

+0

खंड में IOW "न ही कन्स्ट्रक्टर के शरीर के निष्पादन के दौरान प्रारंभ किया गया", सी ++ 03 मानक "प्रारंभिक" शब्द का उपयोग अनौपचारिक तरीके से "मूल्य निर्दिष्ट" करने के लिए करता है। –

+3

@ बिंगा: आप इसे मुफ्त में नहीं प्राप्त कर सकते हैं। –

3

यह वास्तव में बहुत आसान है। वर्ग/संरचना सदस्यों में डिफ़ॉल्ट कन्स्ट्रक्टर वाले ऑब्जेक्ट्स शामिल हो सकते हैं, लेकिन यदि वे नहीं करते हैं, और आप उन्हें प्रारंभिक सूची में एक मूल्य देने के लिए परेशान नहीं करते हैं, न ही उन्हें कन्स्ट्रक्टर के शरीर में सेट करते हैं, तो मूल रूप से वे स्मृति कब्जा - जो भी उनके लिए ढेर या ढेर से निकला था - वहां अभी भी पुरानी कचरा होगी, यानी एक अनिश्चित मूल्य।

पर विचार करें:

struct X 
{ 
    X() : x1(1) { x2 = 2; } 
    double x1, x2, x3; 
    std::string x4; 
}; 

यहाँ, x1 और x2 स्पष्ट X के निर्माता द्वारा initialised रहे हैं, और x4 - एक std::string जा रहा है - डिफ़ॉल्ट "" होने का निर्माण किया है/लंबाई 0. , तथापि, कर सकते थे कुछ भी हो - और इसे सेट करने के बाद तक पढ़ा नहीं जाना चाहिए (यह अनिर्धारित व्यवहार है और वास्तव में कुछ प्रणालियों पर काट सकता है - मान लीजिए कि यह स्मृति की बिट पैटर्न एक डबल के लिए वैध मान भी नहीं हो सकती है, इसलिए पढ़ना इससे कुछ सीपीयू अपवाद/जाल/बाधा उत्पन्न हो सकती है)।

+0

मेरे पास सी ++ 03 की एक प्रति नहीं है। मैं इसे कहां से प्राप्त कर सकता हूं? – Bazinga

+0

केवल अंतिम मसौदा मुफ्त में उपलब्ध है - एक त्वरित Google कई स्रोतों को बदलता है - उदा। http://www.kuzbass.ru:8086/docs/isocpp/।यह आमतौर पर मेरे लिए सबसे सुविधाजनक है, लेकिन आप कुछ छोटे शुल्क (20 या 30 डॉलर यूएस) के लिए अंतिम संस्करण की आधिकारिक प्रति ऑर्डर कर सकते हैं ... मुझे बिल्कुल याद नहीं है कि कहां से है। –

+1

@ बिंगेना: मानक की एक प्रति प्राप्त करने के निर्देशों के लिए http://www.parashift.com/c++-faq-lite/big-picture.html#faq-6.13 में [6.3] देखें। –