यहाँ एक उदाहरण है: जब आप एक class T
के लिए << operator
ओवरलोडिंग कर रहे हैं हस्ताक्षर हो जाएगा:
std::ostream operator<<(std::ostream& os, T& objT)
कार्यान्वयन की जरूरत है जहां
{
//write objT to the os
return os;
}
<<
ऑपरेटर पहले के लिए होने के लिए तर्क को ओस्ट्रीम ऑब्जेक्ट और दूसरी कक्षा आपकी ऑब्जेक्ट टी ऑब्जेक्ट की आवश्यकता होती है।
यदि आप operator<<
को सदस्य फ़ंक्शन के रूप में परिभाषित करने का प्रयास करते हैं तो आपको इसे std::ostream operator<<(std::ostream& os, T& objT)
के रूप में परिभाषित करने की अनुमति नहीं दी जाएगी। ऐसा इसलिए है क्योंकि बाइनरी ऑपरेटर सदस्य फ़ंक्शन केवल एक तर्क ले सकते हैं और invoking ऑब्जेक्ट को this
का उपयोग करके पहले तर्क के रूप में निहित रूप से पारित किया गया है।
यदि आप std::ostream operator<<(std::ostream& os)
सदस्य फ़ंक्शन के रूप में हस्ताक्षर का उपयोग करते हैं तो आप वास्तव में सदस्य फ़ंक्शन std::ostream operator<<(this, std::ostream& os)
के साथ समाप्त हो जाएंगे जो आप जो चाहते हैं वह नहीं करेंगे। इसलिए आपको ऐसे ऑपरेटर की आवश्यकता है जो सदस्य फ़ंक्शन नहीं है और सदस्य डेटा तक पहुंच सकता है (यदि आपके क्लास टी में निजी डेटा है जिसे आप स्ट्रीम करना चाहते हैं, operator<<
कक्षा टी का मित्र होना आवश्यक है)।
@BROY आपका संपादन गलत है, _non-member_ फ़ंक्शन जरूरी नहीं है _friend_। (और मुझे यह भी पता चलता है कि आपका संपादन बदल गया है [बहुत] (http://stackoverflow.com/posts/1132600/revisions) मूल प्रश्न में।) –