यदि आप operator<<
एक सदस्य फ़ंक्शन के रूप में परिभाषित करते हैं , तो यदि आप एक गैर-सदस्य का उपयोग करते हैं, तो इसकी तुलना में एक अलग विघटित सिंटैक्स होगा operator<<
। एक गैर-सदस्य operator<<
एक बाइनरी ऑपरेटर है, जहां एक सदस्य operator<<
एक अपर ऑपरेटर है।
struct MyObj;
std::ostream& operator<<(std::ostream& os, const MyObj& myObj);
struct MyObj
{
MyObj& operator<<(std::ostream& os) { os << *this; return *this; }
int value = 8;
};
std::ostream& operator<<(std::ostream& os, const MyObj& myObj)
{
return os << myObj.value;
}
तो .... आप उन्हें वास्तव में कैसे कहते हैं? ऑपरेटर कुछ मायनों में विषम हैं, मैं आपको चुनौती दूंगा operator<<(...)
कि चीजों को बनाने के लिए अपने सिर में वाक्य रचना लिखें ।
MyObj mo;
mo << std::cout;
mo.operator<<(std::cout);
या आप गैर-सदस्य बाइनरी ऑपरेटर को कॉल करने का प्रयास कर सकते हैं:
MyObj mo;
std::cout << mo;
operator<<(std::cout, mo);
आपको इन कार्यों को operator<<(int)
करने का कोई दायित्व नहीं है, जब आप उन्हें सदस्य के कार्यों में शामिल करते हैं, तो आप सहजता से व्यवहार कर सकते हैं, आप कुछ सदस्य चर को बाईं ओर शिफ्ट कर सकते हैं यदि आप चाहते हैं, तो समझें कि लोग थोड़े से परेशान हो सकते हैं, चाहे आप कितनी भी टिप्पणी करें। लिखो।
लगभग अंत में, ऐसे समय हो सकते हैं जहां ऑपरेटर कॉल के लिए दोनों डिकम्पोजिशन मान्य हैं, आप यहां परेशानी में पड़ सकते हैं और हम इस बातचीत को टाल देंगे।
अंत में, ध्यान दें कि एक अपर सदस्य ऑपरेटर को लिखना कितना अजीब हो सकता है जो कि एक बाइनरी ऑपरेटर की तरह दिखना है (जैसा कि आप सदस्य ऑपरेटरों को आभासी बना सकते हैं ..... यह भी इस मार्ग को नहीं बनाने और चलाने का प्रयास कर रहा है ...। )
struct MyObj
{
std::ostream& operator<<(std::ostream& os) { os << *this; return os; }
int value = 8;
};
यह वाक्य रचना अब कई कोडर्स को परेशान करेगा ...।
MyObj mo;
mo << std::cout << "Words words words";
mo.operator<<(std::cout) << "Words words words";
operator<<(mo.operator<<(std::cout), "Words words words");
ध्यान दें कि cout
यहाँ श्रृंखला में दूसरा तर्क कैसे है .... अजीब सही?