2011-03-02 12 views
5

मान लीजिए आप इस तरह की एक कार्य होते हैं:सी ++ क्या कॉपी कन्स्ट्रक्टर यहां बुलाया गया है?

Foo foo() { 
    Foo foo; 

    // more lines of code 

    return foo; // is the copy constructor called here? 
} 

Foo bar() { 
    // more lines of code 

    return Foo(); // is the copy constructor called here? 
} 

int main() { 
    Foo a = foo(); 
    Foo b = bar(); 
} 

जब किसी भी कार्य के लौटने के लिए, प्रतिलिपि निर्माता कहा जाता है (लगता है वहाँ एक होगा)?

+2

"मान लीजिए कि एक होगा" का क्या मतलब है? प्रत्येक वर्ग में एक कॉपी कन्स्ट्रक्टर होता है (हालांकि यह 'निजी 'हो सकता है, या सी ++ 0x' delete'd में)। यदि कक्षा एक घोषित नहीं करती है, तो यह एक निहित रूप से घोषित प्रतिलिपि बनाता है। – aschepler

+0

यह भी देखें http://stackoverflow.com/questions/665825/copy-constructor-vs-return-value-optimization – xtofl

+2

इस तरह कुछ परीक्षण करना आसान है। बस एक कॉपी कन्स्ट्रक्टर को लागू करें और इसमें एक संदेश प्रिंट करें। – gregg

उत्तर

10

इसे कहा जा सकता है, या इसे नहीं कहा जा सकता है। कंपाइलर में दोनों मामलों में रिटर्न वैल्यू ऑप्टिमाइज़ेशन का उपयोग करने का विकल्प होता है (हालांकि foo की तुलना में ऑप्टिमाइज़ेशन bar में थोड़ा आसान है)।

भले ही आरवीओ कॉपी कन्स्ट्रक्टर को वास्तविक कॉल को समाप्त करता है, फिर भी प्रतिलिपि निर्माता को परिभाषित और सुलभ होना चाहिए।

+1

+1 इसका उल्लेख करने के लिए अभी भी परिभाषित करने की जरूरत है। – xtofl

+0

एनआरवीओ विकल्प भी है, जो वास्तव में foo में आसान हो सकता है। :-) –

8

लागू होने पर या नहीं Return Value Optimization पर निर्भर करता है।

+3

दिलचस्प, मुझे उस subtlety के बारे में पता नहीं था ... – Greg

2

यह कहा जा सकता है। इसे भी अनुकूलित किया जा सकता है। एक ही दिशा में कुछ other question देखें।

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