2009-08-19 18 views
6

अगर मैं एक खुद असाइनमेंट ऑपरेटर, जो आम तौर पर उत्पन्न डिफ़ॉल्ट असाइनमेंट ऑपरेटर से एक अलग हस्ताक्षर हैं परिभाषित:सी ++ डिफ़ॉल्ट असाइनमेंट ऑपरेटर कब पहुंच योग्य नहीं होता है?

struct B; 
struct A { 
void operator = (const B& b) { 
    // assign something 
} 
}; 

इस मामले operator = (A&) में, डिफ़ॉल्ट असाइनमेंट ऑपरेटर करता है (या की तरह, मुझे ठीक कर लें गलत) अपरिभाषित/अप्राप्य हो जाओ?

AFAIK यह डिफ़ॉल्ट कन्स्ट्रक्टर के लिए सच है, जो मौजूद नहीं है, अगर हम किसी अन्य निर्माता को परिभाषित करते हैं। लेकिन मुझे वास्तव में यकीन नहीं है कि यह अन्य "जादू" डिफ़ॉल्ट के मामले में है या नहीं।

कारण मैं पूछता हूं: मैं इससे बचना चाहता हूं कि डिफ़ॉल्ट प्रतिलिपि निर्माता को गलती से एक अंतर्निहित प्रकार रूपांतरण के माध्यम से बुलाया जाता है। यदि यह अस्तित्व में नहीं है, तो यह कभी नहीं हो सकता है।

उत्तर

12

संख्या 12.8/9 का कहना है कि दसवीं कक्षा के लिए असाइनमेंट ऑपरेटर गैर स्थिर, प्रकार एक्स, एक्स & की एक पैरामीटर के साथ गैर टेम्पलेट, एक्स स्थिरांक &, एक्स अस्थिर & या एक्स स्थिरांक अस्थिर & होना चाहिए। और एक नोट है जो जोर देता है कि एक टेम्पलेट की तत्कालता निहित घोषणा को दबा नहीं देती है।

+0

मानक संदर्भ के लिए धन्यवाद! यह वास्तव में मेरे उदाहरणों से कुछ और कहता है। – xtofl

+0

आप सही हैं। मैं अपना जवाब हटा दूंगा। –

+0

@Neil, आपको आश्चर्य हुआ कि क्या उपयोग = डिफ़ॉल्ट हो सकता है। एक जो उपलब्ध है, उसमें स्पष्ट होना है, दूसरा एक तिहाई पहुंच को बदलने के लिए है कि यह कार्यान्वयन को इनलाइन करने की अनुमति देता है जबकि कक्षा के विकास को तोड़ना नहीं है। एक अन्य औचित्य यह है कि यह सुविधा असाइनमेंट की तुलना में व्यापक है और अपवाद बनाने के लिए कोई प्रोत्साहन नहीं था, भले ही इसका कोई उपयोग न हो। – AProgrammer

4

चूंकि A& operator=(B&)A& operator=(const A&) का हस्ताक्षर नहीं है, यह संश्लेषित असाइनमेंट ऑपरेटर के लिए कुछ भी नहीं करता है।

this snippet at codepad.org पर एक नज़र डालें - जहां तक ​​एक उदाहरण प्रमाण के रूप में गिना जाता है।

परीक्षण ड्राइविंग Comau इसके साथ यह भी दिखाता है कि A& operator=(const A&) संश्लेषित है।

+0

बहुत ही रोचक उदाहरण। मैं सुनिश्चित करने के लिए डिफ़ॉल्ट कॉपी असाइनमेंट ऑपरेटर निजी बना दूंगा। – hirschhornsalz

1

AFAIK यह डिफ़ॉल्ट कन्स्ट्रक्टर के लिए सच है, जो मौजूद नहीं है, अगर हम किसी अन्य निर्माता को परिभाषित करते हैं। लेकिन मुझे सच में यकीन नहीं है कि यह अन्य "जादू" डिफ़ॉल्ट के लिए मामला है।

डिफ़ॉल्ट प्रतिलिपि निर्माता एक और निर्माता के प्रावधान से प्रभावित नहीं होगा ...

कारण मैं पूछता हूँ: मैं से बचने के लिए कि डिफ़ॉल्ट प्रतिलिपि निर्माता गलती से एक अंतर्निहित प्रकार के माध्यम से कहा जाता है चाहता हूँ रूपांतरण। यदि यह अस्तित्व में नहीं है, तो यह कभी नहीं हो सकता है।

... या असाइनमेंट ऑपरेटर। उदाहरण के लिए:

class A { 
      private: 
      A& operator= (const A& a); // private here means: forbidden operator 
      public: 
      A(int i) {} 
    }; 

    int main() { 
      A a(2); 
      A b(a);   // copy constructor syntax 1 
      A c = a;  // copy constructor syntax 2 
      // Forbidden: A d; 
      // Forbidden: c = a; 
    } 

डिफ़ॉल्ट प्रतिलिपि कन्स्ट्रक्टर को अक्षम करने के लिए, इसे घोषित करें (निश्चित रूप से लागू करने की आवश्यकता नहीं है)। आपके उपयोग के मामले के संबंध में, आप स्वचालित प्रकार के रूपांतरण को दबाने के लिए "स्पष्ट" कीवर्ड को भी देखना चाहते हैं।

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