2012-05-05 19 views
12

संभव डुप्लिकेट:
How are C array members handled in copy control functions?सी ++: सदस्यवार असाइनमेंट कैसे काम करता है?

अगर मैं एक वर्ग के operator = ओवरराइड नहीं करते, यह डिफ़ॉल्ट सदस्य वार काम का उपयोग करेगा।

लेकिन इसका क्या अर्थ है?

struct A { 
    int array[100]; 
}; 
A a; 
A b=a; 

कोई त्रुटि नहीं। b कैसे a के array को कॉपी करता है? आम तौर पर array_b = array_a अमान्य है।

एक और exampe:

struct A { 
    vector<int> vec; 
}; 
A a; 
A b=a; 

b कैसे copes करता a के vec? असाइनमेंट के माध्यम से (vec_b = vec_a), कन्स्ट्रक्टर (vec_b = vector<int>(vec_a)) या अन्य रहस्य तरीका?

+0

http://stackoverflow.com/questions/4164279/how-are-c-array-members-handled-in-copy-control-functions – Invictus

उत्तर

9
A b=a; 

काम नहीं है, यह के रूप में Copy Initialization कहा जाता है।

अंतर्निहित जेनरेट प्रतिलिपि निर्माता को मौजूदा ऑब्जेक्ट a से एक नई ऑब्जेक्ट b बनाने के लिए कहा जाता है।
निहित रूप से जेनरेट की गई प्रतिलिपि बनाने वाला array सदस्य की एक प्रति बनाता है।

पूर्णता के लिए मैं यहां चिह्नित डुप्लिकेट से मानक उद्धरण जोड़ने जा रहा हूं।

सी ++ 03 मानक: 12.8 (प्रतिलिपि बनाई जा रही वर्ग ऑब्जेक्ट)

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

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

के संभावित डुप्लिकेट आम तौर पर, हाँ। हालांकि सरणी की उथली प्रतिलिपि क्या है? –

+0

@ कोनराड रुडॉल्फ: इस मामले में एक 'memcpy'। * उथली प्रतिलिपि * पॉइंटर्स पर लागू होगी और यही कारण है कि ** ** के नियम ** **। –

+0

इतना उथला नहीं लगता है। –

1

यदि सदस्यों की प्रतिलिपि बनाने वाले निर्माता हैं, तो वे आते हैं। यदि नहीं, तो डिफ़ॉल्ट प्रतिलिपि निर्माता memcpy के बराबर करता है। Memberwise Assignment and Initialization देखें।

गैर-पॉइंटर सरणी के मामले में, प्रत्येक तत्व की प्रतिलिपि बनाई जाती है।

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