रूपांतरण ऑपरेटर और रचनाकारों के बारे में SO पर कुछ प्रश्नों को पढ़ना मुझे उन दोनों के बीच बातचीत के बारे में सोचने लगा, अर्थात् जब 'अस्पष्ट' कॉल होता है। निम्नलिखित कोड पर विचार करें:रूपांतरण कन्स्ट्रक्टर बनाम रूपांतरण ऑपरेटर: प्राथमिकता
class A;
class B {
public:
B(){}
B(const A&) //conversion constructor
{
cout << "called B's conversion constructor" << endl;
}
};
class A {
public:
operator B() //conversion operator
{
cout << "called A's conversion operator" << endl;
return B();
}
};
int main()
{
B b = A(); //what should be called here? apparently, A::operator B()
return 0;
}
ऊपर कोड प्रदर्शित करता है "एक के रूपांतरण ऑपरेटर कहा जाता है", जिसका अर्थ है कि रूपांतरण ऑपरेटर के रूप में निर्माता के लिए विरोध किया कहा जाता है। यदि आप A
से operator B()
कोड को हटा/टिप्पणी करते हैं, तो संकलक इसके बजाय कन्स्ट्रक्टर का उपयोग करने के लिए खुशी से स्विच करेगा (कोड में कोई अन्य परिवर्तन नहीं)।
मेरे प्रश्न हैं:
- के बाद से संकलक पर विचार नहीं करता
B b = A();
एक अस्पष्ट कॉल होने के लिए, यहाँ काम पर पूर्वता के कुछ प्रकार होना चाहिए। यह प्राथमिकता कहां स्थापित की गई है? (सी ++ मानक से एक संदर्भ/उद्धरण की सराहना की जाएगी) - किसी ऑब्जेक्ट-ओरिएंटेड दार्शनिक दृष्टिकोण से, क्या इस तरह कोड को व्यवहार करना चाहिए?
A
ऑब्जेक्टB
ऑब्जेक्ट,A
याB
कैसे बनना चाहिए इस बारे में और कौन जानता है? सी ++ के अनुसार, उत्तरA
है - क्या वस्तु-उन्मुख अभ्यास में कुछ भी है जो सुझाव देता है कि यह मामला होना चाहिए? मेरे लिए व्यक्तिगत रूप से, यह किसी भी तरह से समझ में आता है, इसलिए मुझे यह जानने में दिलचस्पी है कि चुनाव कैसे बनाया गया था।
अग्रिम
लाइन आप टिप्पणी की "// कॉपी निर्माता" एक प्रति निर्माता, यह एक निर्माता है नहीं है: शायद यह है, क्योंकि निम्न कोड अभी भी बी के निर्माता कॉल temporaries के लिए कुछ विशेष व्यवहार है। –
आप सही हैं, मैंने इस शब्द का दुरुपयोग किया। मैंने इसे संपादित कर लिया है। – GRB