5

सी ++ में, क्या मैं सभी मामलों में झूठी शुरुआत के लिए एक नए बूल पर निर्भर कर सकता हूं?क्या मैं झूठी शुरूआत में एक नए बूल पर निर्भर कर सकता हूं?

bool *myBool = new bool(); 

assert(false == *myBool); // Always the case in a proper C++ implementation? 

(अपडेट किया गया कोड टिप्पणी प्रतिबिंबित करने के लिए।)

+0

ध्यान दें कि मेरा कोड एक टेम्पलेट में है जिसका टेम्पलेट इस प्रश्न के मामले में बूल है, लेकिन गैर-पीओडी भी हो सकता है, जिसके लिए मैं डिफ़ॉल्ट कन्स्ट्रक्टर चाहता हूं। – WilliamKF

उत्तर

6

इस मामले में, हाँ; लेकिन कारण काफी सूक्ष्म है।

new bool() कारण मूल्य initialisation है, जो यह false रूप initialises में कोष्ठकों। उनके बिना, new bool इसके बजाय डिफ़ॉल्ट-प्रारंभिकरण करेगा, जो इसे एक अनिर्दिष्ट मान के साथ छोड़ देता है।

व्यक्तिगत रूप से, यदि संभव हो तो मैं इसे new bool(false) देख सकता हूं, यह स्पष्ट करने के लिए कि इसे प्रारंभ किया जाना चाहिए।

(यह माना जाता है कि new का उपयोग करने के लिए एक अच्छा कारण है; और यहां तक ​​कि यदि ऐसा है, तो इसे एक स्मार्ट सूचक द्वारा प्रबंधित किया जाना चाहिए - लेकिन यह इस प्रश्न के दायरे से बाहर है)।

नोट: यह प्रश्न तब उत्तर देता है जब मैंने इसे पढ़ा था; दूसरे उत्तर के लिखे जाने के बाद इसे अपना अर्थ बदलने के लिए संपादित किया गया था।

+0

उन्होंने उस प्रश्न को बदल दिया है जिसका उत्तर वह दूसरे उत्तर पर मेरी टिप्पणी पढ़ने के बाद पहले ही जानता है। – Nawaz

+0

लेकिन मैं एक टेम्पलेट (प्रश्न में दिखाया नहीं गया) के साथ काम कर रहा हूं, इसलिए मैं स्पष्ट रूप से झूठी तर्क प्रदान नहीं कर सकता और इसके बजाय पीओडी और गैर-पीओडी ऑब्जेक्ट्स के लिए मूल्य-प्रारंभिकता पर निर्भर करता हूं जिसके लिए मैं डिफ़ॉल्ट कन्स्ट्रक्टर चाहता हूं। – WilliamKF

+0

@WilliamKF: ठीक है, उस स्थिति में मूल्य-प्रारंभिकरण का उपयोग करने के अलावा कोई विकल्प नहीं है। –

2

नंबर सी में कोई स्वत: प्रारंभ नहीं है ++। आपका नया बूल उस पल में स्मृति में जो कुछ भी था, उसे "आरंभ" किया जाएगा, जो सत्य होने की अधिक संभावना है (क्योंकि कोई गैर-शून्य मान सत्य है), लेकिन कोई गारंटी नहीं है।

आप भाग्यशाली हो सकते हैं और एक कंपाइलर का उपयोग कर सकते हैं जो आपके साथ अच्छा खेलता है और हमेशा एक नए बूल को झूठा मूल्य आवंटित करेगा, लेकिन यह संकलक निर्भर होगा और किसी भी भाषा मानक पर आधारित नहीं होगा।

आपको हमेशा अपने चर शुरू करना चाहिए।

+3

या, वह 'बूल * बी = नया बूल() 'कर सकता है। – Nawaz

+0

तो खाली तर्क इसे झूठी मजबूर करता है? – WilliamKF

+1

@ विलियमकेएफ: हां।:-) यह डिफ़ॉल्ट-प्रारंभिक है जिसे इस मामले में शून्य-प्रारंभिक अर्थ है जिसका अर्थ है 'झूठा'। – Nawaz

3

तीन प्रासंगिक प्रकार के प्रारंभिकरण, शून्य-प्रारंभिकरण, डिफ़ॉल्ट-प्रारंभिकरण, और क्रमशः बूल माध्य के लिए मूल्य-प्रारंभिकरण, कि बूल को गलत माना जाता है, कि बूल का अनिश्चित मूल्य होता है, और बूल है झूठी शुरू हुई।

तो आपको बस यह सुनिश्चित करने की आवश्यकता है कि आपको शून्य या मूल्य प्रारंभिकरण मिल रहा है। यदि स्वचालित या गतिशील संग्रहण अवधि वाला ऑब्जेक्ट प्रारंभिक प्रारंभकर्ता के बिना प्रारंभ किया जाता है तो आपको डिफ़ॉल्ट-प्रारंभिकता मिलती है। मूल्य-प्रारंभिकरण प्राप्त करने के लिए आपको एक खाली प्रारंभकर्ता की आवश्यकता है, या तो () या {}

bool b{}; // b is value-initialized 
bool *b2 = new bool{}; // *b2 is value-initialized 

class foo { 
    bool b; 
    foo() : b() {} 
}; 
foo f; // // f.b is value-initialized 

आप एक bool स्थिर या थ्रेड स्थानीय भंडारण अवधि है और एक प्रारंभकर्ता नहीं है कि के लिए शून्य प्रारंभ मिलता है।

static bool b; // b is zero-initialized 
thread_local bool b2; // b2 is zero-initialized 

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

class foo { 
    bool b; 
}; 
foo f{}; // f.b is zero-initialized 
thread_local foo f2; // f2.b is zero-initialized