2015-12-21 4 views
39

मुझे लगता है कि इसमें इसके बारे में बहुत सारी जानकारी है लेकिन मुझे नहीं पता कि इसे कैसे कहा जाता है।ऑब्जेक्ट obj = ऑब्जेक्ट() और ऑब्जेक्ट obj() के बीच क्या अंतर है?

Object obj(); 

और

Object obj = Object(); 

आप कृपया व्याख्या कर सकते हैं: मैं कोड के अगले दो तार के बीच का अंतर समझ में नहीं कर सकते हैं? या कम से कम कहें कि इसे कैसे कॉल करें।

+0

ठीक है, फिर जब मैं 'ऑब्जेक्ट obj() 'का उपयोग करता हूं तो मुझे कोई समस्या क्यों मिलती है लेकिन' ऑब्जेक्ट obj = ऑब्जेक्ट() 'का उपयोग करते समय प्राप्त नहीं होता है? –

+0

@ghostman अच्छी तरह से आपको 'ऑब्जेक्ट obj;' का उपयोग करना चाहिए, बिना किसी चिपकने वाले – dabadaba

+3

@juanchopanza के बिना, मैंने देखा कि आप सही हैं जो ब्रांड्स सही हैं, वे अलग हैं। मैंने माना ओपी ने कहा 'ऑब्जेक्ट obj',' ऑब्जेक्ट obj() 'नहीं। – dabadaba

उत्तर

49
Object obj(); 

वस्तु का एक इन्स्टेन्शियशन नहीं है, यह एक समारोह obj के घोषणा जो कोई तर्क लेता है और Object का एक उदाहरण देता है ।

Object obj; 

एक default initialization, अंतर्निहित निर्माता (इस प्रकार, डिफ़ॉल्ट अंतर्निहित निर्माता या कोई पैरामीटर के साथ उपयोगकर्ता परिभाषित गैर explicit निर्माता) के साथ यानी इन्स्टेन्शियशन है, और इस घोषणा गैर पॉड Object सदस्यों की अंतर्निहित कंस्ट्रक्टर्स कहता है, और के लिए पीओडी-प्रकार यह उन्हें प्रारंभ नहीं करता है (वे शून्य नहीं होंगे)। यह Object के सदस्यों के सदस्यों के लिए सही है और इसी तरह से।

Object obj{}; 

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

Object obj = Object(); 

सैद्धांतिक रूप से एक दो कदम कथन है: 1) बनाने के अस्थायी Object उदाहरण; 2) फिर कॉपी कन्स्ट्रक्टर/चालक कन्स्ट्रक्टर/कॉपी ऑपरेटर/चाल ऑपरेटर द्वारा ओबीजे का निर्माण करें। लेकिन व्यावहारिक रूप से यह प्रतिलिपि/चाल-elision के साथ दिमाग में बनाया जाएगा (यह सभी आधुनिक कंप्यूटर्स पर डिफ़ॉल्ट रूप से सभी ऑप्टिमाइज़ेशन के साथ सक्षम है, आपको स्पष्ट रूप से एलिशन को अक्षम करना होगा)। इस संस्करण का बेहतर उपयोग न करें।

पूर्व निष्कर्ष

चुनें

Object obj; 

या

Object obj{}; 

पहले चुनें यदि आप कोई अपने पॉड-सदस्यों zeroifying साथ तेजी से प्रारंभ करना चाहते हैं। यदि आप यह सुनिश्चित करना चाहते हैं कि Object के तत्कालता के बाद उसके सभी पीओडी-सदस्य शून्य होंगे तो दूसरा चुनें।

व्यावहारिक रूप से, पहले अपने सदस्यों से पढ़ने से पहले, दोनों प्रकार के सभी आधुनिक ओएस पर रनटाइम में समान गति होती है।

तो ...

निष्कर्ष

उपयोग मूल्य-प्रारंभ:

Object obj{}; 

जब तक आप विदेशी सिस्टम पर एक वास्तविक समय प्रदर्शन की जरूरत है।

+0

स्पष्टीकरण के लिए धन्यवाद! –

+1

ध्यान दें कि 'ऑब्जेक्ट obj {}; 'एक सी ++ 11 सुविधा है, और पिछले संस्करणों में उपलब्ध नहीं थी।मुझे नियमित रूप से इसका सामना करना पड़ा है, क्योंकि हमारे कुछ स्रोत कोड को किसी अन्य टीम द्वारा साझा किया जाता है, जो तकनीकी कारणों से अभी भी सी ++ 09 का उपयोग कर रहा है, इसलिए दोनों परियोजनाओं के लिए आम कोई भी फाइल इस नोटेशन का उपयोग नहीं कर सकती है। –

+0

@DarrelHoffman आओ, यह आज 2015 का अंत है! सी ++ 14 मानक है, सी ++ 17 आ रहा है। – vladon

21
Object obj(); 

एक समारोह के नाम obj कि एक Object वापस आती है और कोई पैरामीटर लेता है की घोषणा:। यह आम तौर पर आप नहीं चाहते हैं।

Object obj = Object(); 

एक Object नामित obj की घोषणा तो एक अस्थायी डिफ़ॉल्ट के साथ प्रारंभ प्रति है Object का निर्माण किया। आप आमतौर पर ऐसा नहीं करना चाहते हैं जब तक आप किसी ऑब्जेक्ट को किसी डिफ़ॉल्ट स्थिति में रीसेट नहीं कर लेते।

आम तौर पर आप एक निर्माता बुला बिना निर्माण करने के लिए आप

Object obj; 
//or 
Object obj{}; 
+0

उन्नत उत्तर के लिए धन्यवाद! –

+4

'ऑब्जेक्ट obj {}; 'मूल्य आरंभ है, डिफ़ॉल्ट प्रारंभिक नहीं। इससे कुछ मामलों में कोई फर्क पड़ सकता है। – juanchopanza

8

बिग अंतर का उपयोग कर सकते चाहते हैं।

पहला एक फ़ंक्शन के लिए कोई फ़ंक्शन प्रोटोटाइप नहीं है जिसमें कोई तर्क नहीं होता है और ऑब्जेक्ट लौटाता है।

दूसरा दूसरा डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करके ऑब्जेक्ट को तुरंत चालू करता है। संदेह से बचने के लिए असाइनमेंट ऑपरेटर नहीं कहा जाता है।

बयान समकक्ष बनाने के लिए पहले मामले में कोष्ठक ड्रॉप करें।

+0

ब्रांड्स को छोड़ना बयान समकक्ष नहीं बनाता है! ऑब्जेक्ट obj = ऑब्जेक्ट(); 'ऑब्जेक्ट का एक अस्थायी उदाहरण बनाता है, फिर अस्थायी से obj बनाता है। ज्यादातर मामलों में कॉपी-एलीशन होगा, लेकिन दुर्लभ मामले हैं जहां यह समझ में आता है। – vladon

+3

दूसरी एक प्रतिलिपि/चाल अस्थायी से 'obj' बनाती है। यह अलग है क्योंकि यदि वस्तु हिल नहीं है तो यह संकलित नहीं होगा। साथ ही, यदि यह चल रहा है, तो इसका ऑब्जेक्ट obj; से अलग व्यवहार हो सकता है, हालांकि इसे वास्तव में कोड लिखने के लिए बुरी शैली माना जाएगा जिसमें अलग-अलग व्यवहार होते हैं। –

31
Object obj(); 

एक वस्तु घोषित करता है, एक वस्तु नहीं! यह "अधिकांश वेक्सिंग पार्स" का एक उदाहरण है।

Object obj = Object(); 

Object की आवश्यकता है एक सुलभ चाल निर्माता है या कॉपी निर्माता (हालांकि संकलक स्थानांतरित/कॉपी eliding खत्म हो सकता है) करने के लिए।

सरल तरीके सिर्फ एक वस्तु बनाने के लिए शामिल हैं:

Object obj; 
Object obj{}; 
+0

धन्यवाद! मैं समझ गया, इसके बारे में नहीं पता। –

+4

'ऑब्जेक्ट obj;' और 'ऑब्जेक्ट obj {};' अलग हैं। – vladon

+1

हां, वे हैं ... – aschepler

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