2009-10-17 17 views
21

सी ++ में, दोनों निम्नलिखित गतिशील वस्तु कृतियों के बीच सटीक अंतर क्या है:ए * पीए = नया ए के बीच अंतर; और ए * पीए = नया ए();

A* pA = new A; 

A* pA = new A(); 

मैं कुछ परीक्षण किया था, लेकिन यह है कि दोनों ही मामलों में, डिफ़ॉल्ट निर्माता कहा जाता है और लगता है केवल यह। मैं प्रदर्शन के बारे में कोई अंतर के लिए देख रहा हूँ ...

धन्यवाद

उत्तर

38

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

सभी मामलों में new A()मूल्य नया A ऑब्जेक्ट प्रारंभ करेगा।

यह पीओडी प्रकारों के लिए स्पष्ट रूप से अलग व्यवहार है लेकिन गैर-पीओडी, गैर-यूनियन वर्ग प्रकारों को बिना किसी घोषित कन्स्ट्रक्टर के प्रभावित करता है।

उदा।

struct A 
{ 
    int a; 
    std::string s; 
}; 

A एक उपयोगकर्ता के घोषित निर्माता के बिना एक गैर पॉड वर्ग प्रकार है। जब Aडिफ़ॉल्ट प्रारंभिक स्पष्ट रूप से परिभाषित कन्स्ट्रक्टर कहलाता है जिसे s (एक गैर-पीओडी प्रकार) के लिए डिफ़ॉल्ट कन्स्ट्रक्टर कहते हैं, लेकिन a प्रारंभ नहीं किया गया है।

जब एक Aहै मूल्य, प्रारंभ के रूप में यह नहीं किया जाता-घोषित निर्माता है, इसके सभी सदस्यों को मूल्य प्रारंभ जो कि s के लिए डिफ़ॉल्ट निर्माता कहा जाता है का मतलब है और aशून्य प्रारंभ है कर रहे हैं।

आईएसओ 14882: 2003 संदर्भ:

  • 5.3.4 [expr.new]/15: कैसे एक new अभिव्यक्ति द्वारा आवंटित वस्तुओं प्रारंभकर्ता छोड़ दिया जाता है जो इस पर निर्भर प्रारंभ कर रहे हैं, कोष्ठक की एक जोड़ी या अन्यथा।

  • 8,5 [dcl.init]/5: का अर्थ शून्य से प्रारंभ, डिफ़ॉल्ट प्रारंभ और मूल्य आरंभ कर देगा।

  • 12.1 [कक्षा.क्टर]/7,8: उपयोगकर्ता द्वारा लिखित कन्स्ट्रक्टर का रूप जो एक स्पष्ट रूप से परिभाषित डिफ़ॉल्ट कन्स्ट्रक्टर के व्यवहार से मेल खाता है।

  • 12.6.2 [class.base.init]/4: किसी कन्स्ट्रक्टर की सदस्य प्रारंभकर्ता सूची में सूचीबद्ध कैसे आधार और सदस्य प्रारंभ किए गए हैं।

+0

यह सही है। –

+0

हम्म, कोई संदर्भ? – hasen

+2

और, शब्द वास्तव में भ्रमित है। पीओडी क्या है? – hasen

0

यह बिल्कुल वैसा ही है, यह भी बुद्धिमान :)

+2

यह वास्तव में सच नहीं है। दो अभिव्यक्तियों के पास उपयोगकर्ता-परिभाषित कन्स्ट्रक्टर के बिना पीओडी-प्रकार और गैर-पीओडी कक्षा प्रकार दोनों के लिए अलग-अलग प्रभाव पड़ते हैं। –

+0

चार्ल्स बेली सही है। –

+2

"पीओडी" क्या है ?? – hasen

0

lexer पहले संस्करण में कम दो पात्रों को स्कैन करना होगा प्रदर्शन, इसलिए संकलन प्रक्रिया एक छोटे से तेजी से होता है;)

+3

है ... और उनके पास अलग-अलग अर्थशास्त्र हैं। –

-1

कृपया एसटीएल कार्यान्वयन कोड (उदा। आवंटक) देखें तो आप समझेंगे।

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