ostream
सी ++ की कक्षा operator<<
के लिए कई डिफ़ॉल्ट ओवरलोड प्रदान करती है, हालांकि वे सभी एक ही तरीके से परिभाषित नहीं हैं।स्टेटिक बनाम सदस्य ऑपरेटर अधिभार: std :: ऑपरेटर << और std :: ostream :: ऑपरेटर <<
namespace std {
ostream &operator<<(ostream &os, char c);
}
जबकि अंकगणित प्रकार, streambuf
, और धारा manipulators के लिए overloads सदस्य के रूप में परिभाषित कर रहे हैं:
overloadschar
के लिए प्रकार, string
प्रकार, और rvalue धाराओं के रूप में इस तरह के रूप मुक्त namespace
-scope कार्यों परिभाषित कर रहे हैं
namespace std {
ostream &ostream::operator<<(int val);
}
मेरे प्रश्न
: जैसेstd::ostream
के कार्यों
क्या इस भेद के लिए कोई कारण है? मैं समझता हूं कि इन ऑपरेटर ओवरलोड पर कॉल थोड़ा अलग तरीके से संचालित होते हैं (यानी namespace
-स्कोप परिभाषाओं के लिए एडीएल), और इसलिए मुझे लगता है कि ऑप्टिमाइज़ेशन उद्देश्यों के लिए किसी विशेष प्रकार के ऑपरेटर अधिभार की प्राथमिकता हो सकती है। लेकिन यहां std::ostream
विभिन्न प्रकार के लिए दोनों प्रकार की परिभाषाओं का उपयोग करता है। क्या इस अर्थात् या कार्यान्वयन अनुकूलन के लिए कोई फायदे हैं जो इसकी अनुमति देता है?
"उन सदस्यों के विपरीत, फ्री फ़ंक्शन ओवरलोड हमेशा ओवरलोड रिज़ॉल्यूशन में भाग लेते हैं, यहां तक कि ओस्ट्रीम से प्राप्त कक्षाओं के लिए भी"। लेकिन क्या आप एडीएल में एक और विशिष्ट दायरे से मेल खाने वाले अन्य मुक्त कार्यों के साथ मुफ्त कार्यों को छुपा नहीं सकते हैं। –
इसके अलावा, 'ओस्ट्रीम' से व्युत्पन्न कक्षाओं से 'ओस्ट्रीम' 'के निहित रूपांतरणों के बारे में बिल्कुल स्पष्ट नहीं है कि मुक्त कार्यों को हल करने में अस्पष्टताएं पैदा हो सकती हैं? माफ़ कीजिये! –
@definecindyconst - यह उन्हें छुपा नहीं करता है। केवल उन्हें अधिभारित करता है। एक सदस्य [वास्तव में छुपा हुआ है, हालांकि] (https://ideone.com/d7XLZh)। – StoryTeller