2010-10-22 10 views
5

ठीक है। हम जानते हैं कि निम्नलिखित कोड संकलित नहीं किया जा सकता है।असाइनमेंट ऑपरेटर फ़ंक्शन में, सरणी ज्ञात रूप से

char source[1024]; 
char dest[1024]; 
// Fail. Use memcpy(dest, source, sizeof(source)); instead. 
dest = source; 

लेकिन, निम्न कोड को संकलित और सही तरीके से व्यवहार किया जा सकता है।

class A { 
    char data[1024]; 
}; 
A source; 
B dest; 
dest = source; 

मैं सोच रहा था, ऑपरेटर असाइनमेंट फ़ंक्शन में, सरणी स्पष्ट रूप से memcpy होगा?

निम्नलिखित पूर्ण परीक्षण कोड हैं।


#include <cstdio> 
#include <memory> 

class A { 
public: 
    char data[1024]; 
}; 

int main() { 
    { 
     A source; 
     A dest; 

     // Initialization 
     char *data = "hello world"; 
     memcpy (source.data, data, strlen(data) + 1); 

     printf ("source.data = %s\n", source.data); 
     printf ("address source.data = %x\n", source.data); 

     // Works! Does this in the operator assignment function, memcpy is 
     // being performed implicitly on array. 
     dest = source; 

     printf ("dest.data = %s\n", dest.data); 
     printf ("address dest.data = %x\n", dest.data); 
    } 

    { 
     char source[1024]; 
     char dest[1024]; 

     // Initialization 
     char *data = "hello world"; 
     memcpy (source, data, strlen(data) + 1); 

     printf ("source = %s\n", source); 
     printf ("address source = %x\n", source); 

     // '=' : left operand must be l-value 
     // dest = source; 
     // Works with memcpy. 
     memcpy(dest, source, sizeof(source)); 

     printf ("dest = %s\n", dest); 
     printf ("address dest = %x\n", dest); 
    } 

    getchar(); 
} 

//RESULT : 
//source.data = hello world 
//address source.data = 12fb60 
//dest.data = hello world 
//address dest.data = 12f758 
//source = hello world 
//address source = 12f344 
//dest = hello world 
//address dest = 12ef3c 
+0

इस मामले में बहुत सी चर्चा क्यों हुई [सी ++ क्यों structs के भीतर सरणी के सदस्यवार असाइनमेंट का समर्थन करता है लेकिन आमतौर पर नहीं?] (Http://stackoverflow.com/questions/3437110/why-does -c-support-memberwise-assign-of-arrays-in-structs-but-not-gene) –

+0

std :: string का विरोध किया, आह? –

उत्तर

2

संकलक उत्पन्न कॉपी-ctor/काम-op बिटवाइज़ कॉपी करता है, तो कोई कॉपी-ctor/काम-op बच्चे तत्वों के लिए मिल गया।

संपादित करें:
यहां अवधारणा को प्रदर्शित करने वाला संशोधित परीक्षण केस है।

#include <cstdio> 
#include <memory> 

class someElement 
{ 
public: 
    someElement() : theData(0) {} 
    // Intentionally copy-edit 
    someElement(const someElement& src) : theData(src.theData + 1) {} 
    ~someElement(){} 

    someElement& operator=(const someElement& rhs) 
    { 
     theData = rhs.theData - 1; 
     return *this; 
    } 

    char theData; 
}; 

class A { 
public: 
    someElement data[1024]; 
}; 

int main() { 
    { 
     A source; 
     A dest; 

     // Initialization 
     char *data = "hello world"; 
     memcpy (source.data, data, strlen(data) + 1); 

     printf ("source.data = %s\n", source.data); 
     printf ("address source.data = %x\n", source.data); 

     // Works! Does this in the operator assignment function, memcpy is 
     // being performed implicitly on array. 
     dest = source; 

     printf ("dest.data = %s\n", dest.data); 
     printf ("address dest.data = %x\n", dest.data); 
    } 

    { 
     someElement source[1024]; 
     someElement dest[1024]; 

     // Initialization 
     char *data = "hello world"; 
     memcpy (source, data, strlen(data) + 1); 

     printf ("source = %s\n", source); 
     printf ("address source = %x\n", source); 

     // '=' : left operand must be l-value 
     // dest = source; 
     // Works with memcpy. 
     memcpy(dest, source, sizeof(source)); 

     printf ("dest = %s\n", dest); 
     printf ("address dest = %x\n", dest); 
    } 

    getchar(); 
} 
+0

सरणी पर bitwise-copy कैसे किया जा रहा है? कोई संदर्भ स्रोत? –

+0

@ यान चेंग CHEOK: ऑपरेटर = बदले में प्रत्येक तत्व के लिए आह्वान किया जाता है। यह – Chubsdad

4

operator=, अगर स्पष्ट रूप से लागू नहीं किया, वर्ग सामग्री का सदस्य वार नकल करता है। आपके encapsulated सरणी के लिए यह काम करेगा, लेकिन कक्षा के डेटा की उचित गहरी प्रतिलिपि सुनिश्चित करने के लिए सामान्य देखभाल में आवश्यक है।

+0

नोट्स का प्रकार है कि अगर सदस्य असाइनमेंट-ऑप है तो यह बिटवाई कॉपी नहीं है। – YeenFei

+2

नहीं। यह एक सदस्यवार प्रतिलिपि करता है। यह आवश्यक है क्योंकि नेस्टेड प्रकारों में घोंसले पदानुक्रम में किसी भी गहराई पर अपना स्वयं का ऑपरेटर =() हो सकता है। उनके ऑपरेटर =() बिट्स की सीमा के बाहर कई दुष्प्रभाव हो सकते हैं जो बिटवाई कॉपी प्रतिलिपि प्रभावित करेंगे। ये दुष्प्रभाव होने की गारंटी है। तो, नहीं, प्रतिलिपि बिटवाई नहीं है। –

+0

@Eric - धन्यवाद, पाठ को अद्यतन किया गया और वैकल्पिक उत्तर उत्तर दिया गया –

9

क्या यह मानक सहायता से उद्धरण देता है? यह शांत आत्म व्याख्यात्मक है

क्षमा करें, मेरे पहले के उत्तर को हटा दें जो कॉपी कन्स्ट्रक्टर से संबंधित था और असाइनमेंट ऑपरेटर की प्रतिलिपि नहीं है।

$ 12,8/30-

एक गैर संघ दसवीं कक्षा प्रदर्शन सदस्य वार अपने subobjects के काम की नकल के लिए निहित से परिभाषित प्रतिलिपि काम ऑपरेटर। प्रत्यक्ष आधार एक्स के कक्षाएं, पहले आवंटित कर रहे हैं क्रम में आधार विनिर्देशक-सूची में उनके घोषणा के क्रम में, और फिर एक्स की तत्काल गैर स्थिर डेटा सदस्यों आवंटित कर रहे हैं में, जिसमें वे कक्षा परिभाषा में घोषित किया गया था। - हैं, अर्थात, किसी भी अनदेखी करता है, तो subobject वर्ग प्रकार का है, वर्ग के लिए प्रति असाइनमेंट ऑपरेटर प्रयोग किया जाता है (जैसा कि स्पष्ट योग्यता से अगर

: प्रत्येक subobject तरीके अपने प्रकार के लिए उपयुक्त में असाइन किया गया है अधिक व्युत्पन्न कक्षाओं में संभावित वर्चुअल ओवरराइडिंग फ़ंक्शन );

- अगर subobject एक सरणी है, प्रत्येक तत्व , असाइन किया गया है ढंग तत्व प्रकार के लिए उपयुक्त है;

- यदि उपरोक्त स्केलर प्रकार का है, तो अंतर्निहित असाइनमेंट ऑपरेटर का उपयोग किया जाता है।

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