2009-10-03 23 views
6

संभव डुप्लिकेट:
Is there a difference in C++ between copy initialization and assignment initialization?सी ++ में int x = 1 और int x (1) के बीच क्या अंतर है?

मैं सेल्सियस के लिए नया हूँ ++, मैं शायद ही कभी इस सिंटैक्स का उपयोग घोषित करने और एक चर प्रारंभ करने में लोगों को देखने के:

int x(1); 

मैंने कोशिश की, संकलक शिकायत नहीं की और आउटपुट int x = 1 जैसा ही है, क्या वे वास्तव में वही बात हैं?

आप सभी को बहुत धन्यवाद।

+2

डुपे: http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-assignment-initializ –

+0

बिल्कुल समान नहीं है। यह प्रश्न विशेष रूप से पीओडी के प्रारंभिकरण के बारे में प्रतीत होता है। – Boojum

उत्तर

13

हां, int x = 1; और int x(1); प्रकारों में निर्मित के लिए समान हैं।

कक्षा प्रकार की वस्तुओं का निर्माण करते समय दो अलग-अलग प्रारंभिक वाक्यविन्यास संक्षेप में अलग होते हैं।

Obj x(y); 

यह प्रत्यक्ष प्रारंभ है और एक स्पष्ट निर्माता कि y लेता है, या कुछ और कि y परोक्ष में बदला जा सकता को खोजने के लिए संकलक निर्देश देता है, और एक्स प्रारंभ करने में इस निर्माता का उपयोग करता है।

Obj x = y; 

यह प्रतिलिपि प्रारंभ है और y परिवर्तित करके एक अस्थायी Obj बनाने के लिए संकलक निर्देश देता है और x initalize को Obj की प्रतिलिपि निर्माता का उपयोग करता है।

कॉपी initalizationप्रत्यक्ष प्रारंभ के बराबर है जब y के प्रकार x के प्रकार के रूप में ही है।

initalization प्रतिलिपि के लिए, क्योंकि अस्थायी प्रयुक्त एक अंतर्निहित रूपांतरण का परिणाम है, कंस्ट्रक्टर्स चिह्नित explicit नहीं माना जाता। निर्मित प्रकार के लिए कॉपी कन्स्ट्रक्टर सुलभ होना चाहिए, लेकिन प्रतिलिपि को संकलक द्वारा ऑप्टिमाइज़ेशन के रूप में हटाया जा सकता है।

+0

और यह इंगित करने लायक है कि ओब्जे एक्स; एक्स = वाई; अभी तक एक और भिन्नता पैदा करता है।इस मामले में, एक्स डिफ़ॉल्ट रूप से बनाया जाएगा। फिर, अगले बयान में, असाइनमेंट ऑपरेटर को बुलाया जाएगा। –

+3

ध्यान देने योग्य एक और चीज यह है कि सादे-पुराने डेटा प्रकारों को int को इस तरह से प्रारंभ करने की इजाजत दी जा रही है (क्लास कन्स्ट्रक्टर के आवेदक के समान वाक्यविन्यास के साथ) टेम्पलेट्स को पारदर्शी रूप से दोनों पीओडी और कक्षा प्रकारों के साथ काम करने की अनुमति देता है। – Boojum

+1

@ बुजुम: उस सुविधा को सी ++ भाषा में जोड़ना प्रारंभिक सूचियों के अंदर किसी भी प्रकार की वस्तुओं को प्रारंभ करने का एक तरीका प्रदान करना था। टेम्पलेट्स के अंदर प्रारंभिकता से यह मेरे लिए अधिक महत्वपूर्ण (और आम) है, जिसे 'टाइप ऑब्जेक्ट = अन्य_बोजेक्ट' सिंटैक्स के साथ हल किया जा सकता है। –

0

मैं कोई सी ++ विशेषज्ञ नहीं हूं, लेकिन यदि यह वही परिणाम देता है, तो क्या इससे कोई फर्क पड़ता है? मुझे लगता है कि अगर आप वास्तव में रुचि रखते थे, तो आप अपने कोड को संकलित कर सकते हैं (लेकिन इकट्ठा नहीं कर सकते) और अंतर देखें कि क्या अंतर है।

संपादित करें: जैसा कि कहीं और उल्लेख किया गया है, वे वास्तव में निर्मित प्रकारों के लिए समान हैं।

+4

बेशक यह मायने रखता है। आप एक ही परिणाम देख सकते हैं, लेकिन इसका मतलब यह हो सकता है कि आप नहीं जानते कि किन दुष्प्रभावों को देखने के लिए या किनारे के मामलों के बारे में पता नहीं है जो आपको अलग-अलग परिणाम देंगे। यह एक शुरुआती/मध्यवर्ती प्रोग्रामर से एक बहुत ही उचित प्रश्न है। – mob

1

पीओडी-प्रकारों के लिए, दोनों कथन समान हैं।

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