2010-11-12 3 views
28

यह कुछ ऐसा है जो मैंने लंबे समय से सोचा है।कॉपी नियंत्रण कार्यों में सी ++ सरणी सदस्यों को कैसे प्रबंधित किया जाता है?

struct matrix 
{ 
    float data[16]; 
}; 

मुझे पता है कि डिफ़ॉल्ट निर्माता और नाशक इस विशिष्ट उदाहरण (कुछ भी नहीं) में करते हैं, लेकिन क्या प्रतिलिपि निर्माता और प्रति असाइनमेंट ऑपरेटर के बारे में: निम्नलिखित उदाहरण लें?

struct matrix 
{ 
    float data[16]; 

    // automatically generated copy constructor 
    matrix(const matrix& that) : // What happens here? 
    { 
     // (or here?) 
    } 

    // automatically generated copy assignment operator 
    matrix& operator=(const matrix& that) 
    { 
     // What happens here? 

     return *this; 
    } 
}; 

यह std::copy या std::uninitialized_copy या memcpy या memmove या क्या शामिल है?

+3

यह वास्तव में सी नहीं है, लेकिन (ज्यादातर) सी ++ है। –

+0

@DervinThunk मैंने सी से सी ++ के प्रश्न का शीर्षक बदल दिया – jfritz42

उत्तर

37

यह मानक 12.8 (कक्षा वस्तुओं की प्रतिलिपि) में कहता है। कॉपी निर्माण:

प्रत्येक subobject तरीके अपने प्रकार के लिए उपयुक्त में कॉपी किया जाता है:

  • अगर subobject वर्ग प्रकार का है, वर्ग के लिए प्रति निर्माता प्रयोग किया जाता है;
  • यदि उपरोक्त एक सरणी है, तो प्रत्येक तत्व की प्रतिलिपि बनाई जाती है, तत्व प्रकार के लिए उचित तरीके से;
  • यदि subobject स्केलर प्रकार का है, तो अंतर्निहित असाइनमेंट ऑपरेटर का उपयोग किया जाता है।

कॉपी काम:

प्रत्येक subobject तरीके अपने प्रकार के लिए उपयुक्त में असाइन किया गया है:

  • अगर subobject वर्ग प्रकार, वर्ग के लिए प्रति असाइनमेंट ऑपरेटर की है का उपयोग किया जाता है (जैसे कि स्पष्ट योग्यता के द्वारा, यानी, अधिक व्युत्पन्न कक्षाओं में किसी भी संभावित आभासी ओवरराइडिंग कार्यों को अनदेखा करना);
  • यदि उपरोक्त एक सरणी है, तो प्रत्येक तत्व को तत्व प्रकार के लिए उपयुक्त तरीके से असाइन किया गया है;
  • यदि subobject स्केलर प्रकार का है, तो अंतर्निहित असाइनमेंट ऑपरेटर का उपयोग किया जाता है।
संबंधित मुद्दे

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