आपके उदाहरण में एक और कारण - यह friend
होना चाहिए क्योंकि कक्षा परिभाषा के अंदर एक नि: शुल्क फ़ंक्शन को परिभाषित करने का यही एकमात्र तरीका है। यदि आप एक गैर-मित्र मुक्त फ़ंक्शन चाहते थे, तो उसे कक्षा के बाहर परिभाषित करना होगा।
आप कक्षा में इसे परिभाषित क्यों करना पसंद करेंगे? कभी कभी यह सब ऑपरेटरों को एक साथ परिभाषित करने के लिए अच्छा है:
struct SomeClass {
// blah blah blah
SomeClass &operator+=(const SomeClass &rhs) {
// do something
}
friend SomeClass operator+(SomeClass lhs, const SomeClass &rhs) {
lhs += rhs;
return lhs;
}
// blah blah blah
// several pages later
};
हो सकता है थोड़ा अधिक उपयोगकर्ता के अनुकूल से:
struct SomeClass {
// blah blah blah
SomeClass &operator+=(const SomeClass &rhs) {
// do something
}
// blah blah blah
// several pages later
};
SomeClass operator+(SomeClass lhs, const SomeClass &rhs) {
lhs += rhs;
return lhs;
}
इस कोर्स है कि आप वर्ग परिभाषा संबंधित सदस्य कार्यों को परिभाषित कर रहे की हो जाती है , बल्कि उन्हें वहां घोषित करना और उन्हें .cpp फ़ाइल में परिभाषित करना।
संपादित करें: मैंने वास्तव में इसके बारे में सोचने के बिना + = और + उदाहरण के रूप में उपयोग किया है, लेकिन आपका प्रश्न operator<<
है, जिसमें operator+
जैसे कोई करीबी संबंधित ऑपरेटर नहीं हैं। लेकिन अगर operator<<
प्रिंटिंग से संबंधित एक या अधिक सदस्य फ़ंक्शंस को कॉल करता है, तो आप इसे परिभाषित कर सकते हैं जहां उन्हें परिभाषित किया गया है।
स्रोत
2010-03-17 04:36:51
क्या आपको वास्तव में किसी अन्य कारण की आवश्यकता है? –
@mmyers: मैं बस इसे जितना स्पष्ट कर सकता हूं उसे समझने की कोशिश करता हूं .... – skydoor
यह स्पष्ट रूप से सदस्य कार्य नहीं हो सकता है (चार्ल्स बेली का जवाब देखें), लेकिन यह * दोस्त * नहीं होना चाहिए आप कक्षा के सार्वजनिक इंटरफ़ेस के संदर्भ में इसे कार्यान्वित कर सकते हैं, जो कि सुपर होगा। – UncleBens