2013-07-31 7 views
10

मैंने देखा कि कन्स्ट्रक्टर वापस आने से पहले this से eax स्थानांतरित करेगा। यह एक वापसी मूल्य या कुछ और है?क्यों निर्माता इस सूचक को "वापस" करते हैं?

class CTest { 
    int val_; 
public: 
    CTest() { 
0093F700 push  ebp 
0093F701 mov   ebp,esp 
0093F703 sub   esp,0CCh 
0093F709 push  ebx 
0093F70A push  esi 
0093F70B push  edi 
0093F70C push  ecx 
0093F70D lea   edi,[ebp-0CCh] 
0093F713 mov   ecx,33h 
0093F718 mov   eax,0CCCCCCCCh 
0093F71D rep stos dword ptr es:[edi] 
0093F71F pop   ecx 
0093F720 mov   dword ptr [this],ecx 
     val_ = 1; 
0093F723 mov   eax,dword ptr [this] 
0093F726 mov   dword ptr [eax],1 
    } 
0093F72C mov   eax,dword ptr [this] 
0093F72F pop   edi 
0093F730 pop   esi 
0093F731 pop   ebx 
0093F732 mov   esp,ebp 
0093F734 pop   ebp 
0093F735 ret 

VS2012 डिबग मोड


मैंने पाया कि new अपने "वापसी मान" का प्रयोग करेंगे। ऐसा लगता है कि if(operator new() == 0) return 0; else return constructor();

class CTest { 
    int val_; 
public: 
    CTest() { 
     val_ = 1; 
     __asm { 
      mov   eax, 0x12345678 
      pop   edi 
      pop   esi 
      pop   ebx 
      mov   esp,ebp 
      pop   ebp 
      ret 
     } 
    } 
}; 

int main() { 
    CTest *test = new CTest; // test == 0x12345678 
    return 0; 
} 
+2

रचनाकार कुछ भी वापस नहीं करते हैं, वे केवल आपको बनाए गए वस्तु को आरंभ करने का अवसर देते हैं। –

+0

यह एक जंगली अनुमान है, लेकिन मुझे लगता है कि यह सबक्लास के निर्माण का समर्थन करने के लिए है। – Mehrdad

+17

यह एक कार्यान्वयन विस्तार है। प्रति सी ++ मानक कन्स्ट्रक्टर कुछ भी वापस नहीं करता है और आपको उस पर भरोसा नहीं करना चाहिए। [कुछ संबंधित एसओ चर्चा] (http://stackoverflow.com/questions/10356109/c-constructors-have-no-return-type-just-exactly-why) – Tony

उत्तर

1

आपका दूसरा प्रश्न आपके पहले से असहमत है। newif (operator new() == 0) return 0; else return constructor(); का उपयोग कर सकते हैं यदि constructor() स्थिति परिणाम का उत्पादन कर रहा है?

वैसे भी ...

  1. क्या संकलक रजिस्टरों के साथ करता है संकलक का व्यवसाय है। रजिस्टरों को जो भी जानकारी तुरंत उपयोगी होती है, और यदि संकलक इस विश्वास के साथ लिखा जाता है कि हर बार कन्स्ट्रक्टर का उपयोग किया जाता है, तो ऑब्जेक्ट तुरंत बाद में उपयोग किया जाता है, यह उचित रूप से this को रजिस्टर में डाल सकता है।

    एक एबीआई को ऐसा करने के लिए रचनाकारों की आवश्यकता हो सकती है, लेकिन मुझे कोई संदेह है। वैसे भी, ऐसे प्रोटोकॉल केवल पुस्तकालयों से निर्यात की गई चीज़ों पर लागू होते हैं, न कि सख्ती से कार्यक्रमों के भीतर।

  2. कोई भी new अभिव्यक्ति operator new0 के विरुद्ध किसी ऑब्जेक्ट को प्रारंभ करने से पहले परिणाम की जांच करता है। operator newnullptr (या NULL, आदि) लौटाकर विफलता का संकेत दे सकता है।

    यह वास्तव में प्लेसमेंट नए अभिव्यक्तियों के साथ एक समस्या हो सकती है, क्योंकि यह अपरिहार्य रनटाइम ओवरहेड का प्रतिनिधित्व करता है क्योंकि दिए गए पॉइंटर को आम तौर पर पहले से ही गैर-शून्य माना जाता है।

0

यह और अन्य भाषाओं डिजाइन द्वारा एक फीचर, C++ हो सकता है, किसी दिए गए उदाहरण के लिए एक संदर्भ लौटने वस्तु ही द्वारा की पेशकश की सुविधाओं में से एक अधिक "मुहावरेदार" उपयोग की अनुमति देता, संक्षेप में यह Named parameter Idiom है।

लेकिन यह केवल 1 विकल्प है, यह कभी-कभी उपयोगी हो सकता है, खासकर यदि आप अपनी लाइब्रेरी को इस तरीके से डिज़ाइन करने में सक्षम हैं कि यह केवल महत्वपूर्ण मात्रा में पैरामीटर पास करने की आवश्यकता के बिना "कार्रवाई करता है", इसलिए विधि कॉल की श्रृंखला पठनीय रहता है।

+1

एक कन्स्ट्रक्टर के पास कभी भी वापसी मूल्य नहीं होता है। एक उदाहरण लौटने वाला एक फ़ंक्शन एक कारखाना कार्य होगा, न कि एक निर्माता। ऑब्जेक्ट प्रति से वापस लौटने की बजाए, एक नई ऑब्जेक्ट पर * संदर्भ * को लौटाना, सी ++ में एक त्रुटि है जब तक वस्तु किसी विशेष रूप से आवंटित नहीं होती है। – Potatoswatter

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