2012-09-09 28 views
6

के लिए इस कोड को करते हैं:C++: डाली ऑपरेटर बनाम असाइन ऑपरेटर बनाम रूपांतरण निर्माता प्राथमिकता

Test1 t1; 
Test2 t2; 
t1 = t2; 

मेरा मानना ​​है कि तीन तरीके t1 = t2

    को
  • लागू करने के लिए कैसे हो (या अधिक?) Test1
  • में अधिभार असाइन ऑपरेटर Test2
  • में टाइप डाली ऑपरेटर ओवरलोड Test1(const Test2&) बनाने के लिए रूपांतरण निर्माता

मेरी जीसीसी परीक्षण के अनुसार, यह है कि क्या प्रयोग किया जाता है की प्राथमिकता है:

  1. असाइन ऑपरेटर
  2. रूपांतरण निर्माता और प्रकार डाली ऑपरेटर (अस्पष्ट)
  3. स्थिरांक रूपांतरण निर्माता और कॉन्स टाइप कास्ट ऑपरेटर (संदिग्ध)

कृपया मुझे यह प्राथमिकता क्यों समझने में मदद करें।

t1.operator=(t2); 

अब अधिभार संकल्प के सामान्य नियम लागू होते हैं:

मैं परीक्षण के लिए इस कोड (कुछ लाइनों uncomment आज़माने के लिए)

struct Test2; 
struct Test1 { 
    Test1() { } 
    Test1(const Test2& t) { puts("const constructor wins"); } 
// Test1(Test2& t) { puts("constructor wins"); } 
// Test1& operator=(Test2& t) { puts("assign wins"); } 
}; 

struct Test2 { 
    Test2() { } 
// operator Test1() const { puts("const cast wins"); return Test1(); } 
// operator Test1() { puts("cast wins"); return Test1(); } 
}; 


int main() { 
    Test1 t1; 
    Test2 t2; 
    t1 = t2; 
    return 0; 
} 
+0

'टेस्ट 1 :: टेस्ट 1 (कॉन्स्ट टेस्ट 2 और)' एक "प्रतिलिपि बनाने वाला" नहीं है, यह एक "कनवर्टिंग कन्स्ट्रक्टर" है। – aschepler

+0

यह पोस्ट बताता है कि क्यों रूपांतरण ऑपरेटर उच्च प्राथमिकता का है: http://stackoverflow.com/questions/1384007/conversion-constructor-vs-conversion-operator-precedence –

उत्तर

13

बयान t1 = t2; के बराबर है का उपयोग करें। यदि कोई सीधा मैच है, तो वह चुना गया है। यदि नहीं, तो निहित रूपांतरणों को स्वचालित रूप से जेनरेट किया गया, "निहित रूप से परिभाषित") प्रति-असाइनमेंट ऑपरेटर के साथ उपयोग के लिए माना जाता है।

दो संभावित निहित, उपयोगकर्ता परिभाषित रूपांतरण हैं। सभी उपयोगकर्ता-निर्धारित रूपांतरण एक समान गिनती, और अगर दोनों परिभाषित कर रहे हैं, अधिभार अस्पष्ट है: Test1::Test1(Test2 const &) रूपांतरण निर्माता के माध्यम से

  • Convert t2 एक Test1 करने के लिए।

  • t2Test2::operator Test1() const कास्ट ऑपरेटर के माध्यम से Test1 पर कनवर्ट करें।

+0

@ लुचियान के दूसरे आदर्श उदाहरण में, रूपांतरण फ़ंक्शन जीतता है क्योंकि यह 'टेस्ट 2 और' 't2' को बांधता है, न कि 'कॉन्स्ट टेस्ट 2' '। मैंने सोचा कि http://ideone.com/U38vK भी संदिग्ध होना चाहिए था, लेकिन ऐसा लगता है कि g ++ कन्स्ट्रक्टर पसंद करता है। – aschepler

+2

आह। यदि आप '-pedantic' मांगते हैं तो g ++ उन्हें अस्पष्ट कहते हैं। शरारती डिफ़ॉल्ट जी ++। – aschepler

+0

@ केरेकस्क: यदि कास्ट ऑपरेटर निरंतर नहीं है, तो यह रूपांतरण कन्स्ट्रक्टर को धड़कता है और कोई अस्पष्टता नहीं होती है। http://liveworkspace.org/code/7795254ae49b4d6350f0ede57615e4c6 –

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