2010-09-17 18 views
8

जब आप C++ एक नया उद्देश्य यह है कि ढेर पर रहता है, (जिस तरह से मैं ज्यादातर यह देखा है) बनाने आप ऐसा करते हैं:सी चर और ढेर चर ढेर ++

CDPlayer player; 

जब आप पर एक वस्तु बनाने ढेर आप new फोन:

CDPlayer* player = new CDPlayer(); 

लेकिन जब आप ऐसा करते हैं:

CDPlayer player=CDPlayer(); 

यह एक ढेर आधारित वस्तु, ख बनाता है उस और शीर्ष उदाहरण के बीच क्या अंतर है?

+1

संभावित डुप्लिकेट [टाइप नाम के बाद कोष्ठक नए के साथ अंतर बनाते हैं?] (Http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name-make- एक-अंतर-नई-नई) – fredoverflow

उत्तर

20

अंतर पॉड वाले महत्वपूर्ण है (मूल रूप से, सभी में निर्मित int, bool, double आदि के साथ साथ सी-तरह structs और यूनियनों केवल अन्य फली से बनाया तरह प्रकार के), जिसके लिए डिफ़ॉल्ट प्रारंभ के बीच एक अंतर है और मूल्य प्रारंभिकरण। फली लिए, एक साधारण

T obj; 

obj अप्रारंभीकृत छोड़ देंगे, जबकि T() वस्तु डिफ़ॉल्ट-initializes। तो

T obj = T(); 

यह सुनिश्चित करने का एक अच्छा तरीका है कि कोई ऑब्जेक्ट ठीक से प्रारंभ किया गया हो।

यह टेम्पलेट कोड में विशेष रूप से सहायक है, जहां T या तो पीओडी या गैर-पीओडी प्रकार हो सकता है। जब आप जानते हैं कि T एक पीओडी प्रकार नहीं है, T obj; पर्याप्त है।

परिशिष्ट: तुम भी

T* ptr = new T; // note the missing() 

(और से बचने आवंटित वस्तु के प्रारंभ करता है, तो T एक पॉड है) लिख सकते हैं।

+2

उपयोगकर्ता-परिभाषित प्रकार पीओडी भी हो सकते हैं, इस मामले में जब कोई स्पष्ट प्रारंभिक कार्य नहीं किया जाता है तो वे बिल्ट-इन्स की तरह व्यवहार करेंगे। –

+0

@ कोनराड: आप सही हैं, भेद पीओडी और गैर-पीओडी के बीच है! इसे इंगित करने के लिए धन्यवाद, मैंने तदनुसार अपना जवाब बदल दिया। – sbi

+0

सी ++ 0x में, आप 'टी obj {}; 'के साथ उचित प्रारंभिक सुनिश्चित कर सकते हैं। – fredoverflow

8

जब आप C++ एक नया उद्देश्य यह है कि ढेर पर रहता है बनाने के लिए, (...) आप यह करते हैं:

CDPlayer player; 

स्टैक पर जरूरी नहीं: चर इस तरह से घोषित स्वचालित है भंडारण। जहां वे वास्तव में जाते हैं निर्भर करता है। यह ढेर पर हो सकता है (विशेष रूप से जब घोषणा एक विधि के अंदर होती है) लेकिन यह कहीं और भी हो सकती है।

मामले पर विचार करें जहां घोषणा एक क्लास के भीतर है:

class foo { 
    int x; 
}; 

अब x के भंडारण जहां कभी वर्ग उदाहरण संग्रहीत होती है। यह ढेर पर संग्रहीत है, तो इसलिए x है:

foo* pf = new foo(); // pf.x lives on the heap. 
foo f; // f.x lives where f lives, which has (once again) automatic storage. 
+4

@ टोनी: क्या यह वास्तव में सवाल का जवाब देता है? यह एक पूरक टिप्पणी के रूप में बल्कि था ...। यह आपके पहले और तीसरे कोड के बीच के अंतर को स्पर्श नहीं करता है, क्योंकि अन्य उत्तरों ने पहले से ही ऐसा किया है। –

0
CDPlayer* player = new CDPlayer(); 

यह वास्तव में क्या करता है ढेर पर एक सूचक बनाने है और यह एक CDPlayer वस्तु ढेर पर आवंटित को इंगित करता है।

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