2017-09-30 23 views
7

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 विभिन्न प्रकार के लिए दोनों प्रकार की परिभाषाओं का उपयोग करता है। क्या इस अर्थात् या कार्यान्वयन अनुकूलन के लिए कोई फायदे हैं जो इसकी अनुमति देता है?

उत्तर

5

मैं कल्पना करता अनुकूलन प्रयोजनों

खैर के लिए ऑपरेटर अधिभार की एक विशेष प्रकार के लिए एक प्राथमिकता हो सकता है, नहीं। दिन के अंत में दोनों को फ़ंक्शन कॉल के रूप में पूर्ववर्ती किया जाता है। ओवरलोड रिज़ॉल्यूशन के लिए भी एक स्पष्ट निहितार्थ नहीं है। के बाद से मानक [over.match] पर तय, पैराग्राफ 2 और 6:

या तो संकार्य एक प्रकार है कि एक वर्ग या एक गणन है है, तो एक उपयोगकर्ता परिभाषित ऑपरेटर समारोह में घोषित किया जा सकता है इस लागू करता है कि ऑपरेटर या उपयोगकर्ता द्वारा परिभाषित रूपांतरण को एक प्रकार के ऑपरेटर के लिए उपयुक्त एक प्रकार में बदलने के लिए आवश्यक हो सकता है। इस मामले में, ओवरलोड रिज़ॉल्यूशन का उपयोग यह निर्धारित करने के लिए किया जाता है कि कौन सा ऑपरेटर फ़ंक्शन या अंतर्निहित ऑपरेटर ऑपरेटर को लागू करने के लिए बुलाया जाना है।

ओवरलोड रिज़ॉल्यूशन के लिए उम्मीदवार कार्यों का सेट सदस्य उम्मीदवारों, गैर-सदस्य उम्मीदवारों और अंतर्निहित उम्मीदवारों का संघ है। तर्क सूची में ऑपरेटर के सभी ऑपरेटरों शामिल हैं। उम्मीदवार कार्यों के सेट से सबसे अच्छा कार्य [over.match.viable] और [over.match.best] के अनुसार चुना गया है।

उन सभी ऑपरेटर ओवरलोड को एक साथ हल किया गया है। एकमात्र अर्थपूर्ण अंतर यह है कि ostream से प्राप्त कक्षा कुछ सदस्य ओवरलोड को छिपाने का विकल्प चुन सकती है। यह व्युत्पन्न वर्ग में ओवरलोडिंग के तरीके के अनुसार किया जाता है। स्पष्ट रूप से घोषित ओवरलोड केवल लागू होंगे। उन सदस्यों के विपरीत, नि: शुल्क फ़ंक्शन ओवरलोड हमेशा ostream से प्राप्त कक्षाओं के लिए अधिभार संकल्प में भाग लेंगे।

चूंकि एक व्युत्पन्न वर्ग को ostream& में परिवर्तित करने की आवश्यकता है, ताकि फ्री-फ़ंक्शन ओवरलोड को चुना जा सके, इसके स्वयं के निहित रूपांतरण अनुक्रम को रैंक किया जाना चाहिए।और यदि सभी अधिभार मुक्त कार्य होते हैं तो यह अस्पष्टता का कारण बन सकता है।

तो विचार उन प्रकारों को अलग करना बहुत अच्छा हो सकता है जो उपयोगी प्रकारों से एक अस्पष्टता (पॉइंटर्स और अंकगणितीय प्रकार) पैदा कर सकते हैं जिन्हें हम हमेशा उपलब्ध करना चाहते हैं (सी-तारों और व्यक्तिगत पात्रों के लिए पॉइंटर्स)। और उन अस्पष्टताओं से बचने के लिए "कम उपयोगी" छिपाने की अनुमति दें।


जैसा डब्लू डब्ल्यू द्वारा इंगित किया गया है। ostream वास्तव में basic_ostream<char> है। नि: शुल्क फ़ंक्शंस डेटा के लिए ऐसा होता है जिसके लिए केवल स्ट्रीमिंग की आवश्यकता होती है। मूल "वर्णमाला" धाराओं में वर्ण या तार। तो basic_ostream<wchar_t> के लिए वे नि: शुल्क फ़ंक्शन wchar_t और wchar_t* स्वीकार करेंगे। यह काफी संभव है कि सरल स्ट्रीमिंग को धाराओं के निजी खंड में किसी भी पहुंच की आवश्यकता नहीं है।

अन्य ओवरलोड उन डेटा के लिए हैं जिन्हें स्ट्रीमिंग से पहले क्रमबद्ध करने की आवश्यकता होती है। चूंकि कहा गया है कि सीरियलाइजेशन धाराओं को आंतरिक राज्य के साथ कसकर जोड़ता है, इसलिए यह अधिभार उन सदस्यों को बनाने के लिए और अधिक समझ में आता है।

+0

"उन सदस्यों के विपरीत, फ्री फ़ंक्शन ओवरलोड हमेशा ओवरलोड रिज़ॉल्यूशन में भाग लेते हैं, यहां तक ​​कि ओस्ट्रीम से प्राप्त कक्षाओं के लिए भी"। लेकिन क्या आप एडीएल में एक और विशिष्ट दायरे से मेल खाने वाले अन्य मुक्त कार्यों के साथ मुफ्त कार्यों को छुपा नहीं सकते हैं। –

+0

इसके अलावा, 'ओस्ट्रीम' से व्युत्पन्न कक्षाओं से 'ओस्ट्रीम' 'के निहित रूपांतरणों के बारे में बिल्कुल स्पष्ट नहीं है कि मुक्त कार्यों को हल करने में अस्पष्टताएं पैदा हो सकती हैं? माफ़ कीजिये! –

+1

@definecindyconst - यह उन्हें छुपा नहीं करता है। केवल उन्हें अधिभारित करता है। एक सदस्य [वास्तव में छुपा हुआ है, हालांकि] (https://ideone.com/d7XLZh)। – StoryTeller

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