2010-04-15 20 views
9

बस एक त्वरित सवाल।वापसी के लिए एक निर्माता का उपयोग

मैंने कुछ कोड लिखा है जो एक कस्टम क्लास कमांड देता है, और मैंने जो कोड लिखा है वह ठीक काम करता है। मैं सोच रहा था कि क्या कोई कारण है कि मुझे ऐसा नहीं करना चाहिए। यह कुछ इस तरह है:

Command Behavior::getCommand() 
{ 
    char input = 'x'; 

    return Command (input, -1, -1); 
} 

वैसे भी, मैंने पढ़ा है कि निर्माताओं के लिए एक वापसी मूल्य नहीं होती हैं, लेकिन इस छ में काम करता है ++।

किसी भी सलाह के लिए धन्यवाद,

रिज़

+1

यह ध्यान दिया जाना चाहिए: यह, अर्थात्, एक अस्थायी वस्तु बनाता है, फिर इसे फ़ंक्शन रिटर्न के रूप में कॉपी करता है। हालांकि, कंपाइलर्स को ऐसा करने की अनुमति है जिसे रिटर्न-वैल्यू ऑप्टिमाइज़ेशन या आरवीओ कहा जाता है। इसका मतलब है कि इसे एक प्रतिलिपि करने की अनुमति नहीं है, उदाहरण के लिए: 'कमांड x = getCommand();' जो भी वापस लौटाया गया था उसकी प्रतिलिपि बनाने के बजाय ''x' का निर्माण करेगा। – GManNickG

+2

लंबी कहानी छोटी: आप सब ठीक कर रहे हैं! – Potatoswatter

उत्तर

7

निर्माता अपने आप में एक वापसी मान नहीं है। यह क्या करता है अस्थायी Command ऑब्जेक्ट बनाता है और कॉलर को निर्मित ओबेट लौटाता है। यह प्रभावी रूप से वही है जैसा आपने कहा था:

Command temp(input, -1, -1); 
return temp; 

यह किसी भी C++ कंपाइलर पर काम करेगा।

+0

इसके लिए धन्यवाद! खुशी है कि मुझे इसे फिर से लिखना नहीं है, यह अच्छी कार्यक्षमता है। –

2

getCommand एक निर्माता नहीं है। उपरोक्त पूर्ण रूप से वैध है, और आम तौर पर कुशल, थ्रू रिटर्न-वैल्यू ऑप्टिमाइज़ेशन (आरवीओ) के कारण, जो (मुझे लगता है) लागू नहीं होगा यदि आपने स्थानीय चर को तुरंत चालू किया और उसे वापस कर दिया।

+0

विधिवत ध्यान दिया, चीयर्स! –

+2

कई परिस्थितियों में, स्थानीय चरों को भी सैन्स-कॉपी कन्स्ट्रक्टर को सुरक्षित किया जा सकता है। –

+1

जिसे नामांकित रिटर्न वैल्यू ऑप्टिमाइज़ेशन, या एनआरवीओ कहा जाता है। – GManNickG

1

निर्माता के पास वापसी मूल्य नहीं है; आप स्पष्ट रूप से कक्षा के अस्थायी उदाहरण का निर्माण कर रहे हैं, और इसे वापस कर रहे हैं। इसमें कुछ भी गलत नहीं है, इसके अलावा एक प्रतिलिपि बनायेगी।

यदि आप प्रतिलिपि से बचना चाहते हैं, तो आपके पास कुछ विकल्प हैं, जिनमें से एक आउट पैरामीटर है जो Command* है और नया उपयोग करें और हटाएं।

0

आपके पास वापसी मूल्य के साथ कोई कन्स्ट्रक्टर नहीं है। Command::Command(char, int, int) आपका कन्स्ट्रक्टर है।

आपके पास एक ऐसी विधि है जो ऑब्जेक्ट लौटाती है, जो पूरी तरह से सामान्य है।

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