c++ - सी++ में किसी वर्ग के सदस्यों को संदर्भित करने के लिए मैं डॉट, तीर या डबल कॉलन का उपयोग कब करूं?
c++-faq (2)
अन्य सी-व्युत्पन्न भाषाओं (जैसे जावा या सी #) से सी ++ तक आ रहा है, यह पहली बार बहुत भ्रमित है कि सी ++ में कक्षा के सदस्यों को संदर्भित करने के तीन तरीके हैं: a::b
, ab
, और a->b
। मैं इन ऑपरेटरों में से किस का उपयोग कब करूं?
(नोट: यह स्टैक ओवरफ्लो के सी ++ एफएक्यू में प्रवेश करने के लिए है । यदि आप इस फॉर्म में एक एफएक्यू प्रदान करने के विचार की आलोचना करना चाहते हैं, तो मेटा पर पोस्ट करना जो यह सब शुरू कर देगा, ऐसा करने का स्थान होगा। उस प्रश्न की निगरानी सी ++ चैटरूम में की जाती है, जहां एफएक्यू विचार पहली जगह शुरू हुआ था, इसलिए आपके उत्तर को उन लोगों द्वारा पढ़ा जाने की संभावना है जो इस विचार के साथ आए थे।)
तीन अलग-अलग ऑपरेटरों सी ++ कक्षा या वर्ग वस्तु के सदस्यों तक पहुंचने के लिए उपयोग करता है, अर्थात् डबल कॉलन ::
, डॉट .
, और तीर ->
, तीन अलग-अलग परिदृश्यों के लिए उपयोग किया जाता है जो हमेशा अच्छी तरह परिभाषित होते हैं। यह जानने से आप किसी भी कोड में क्रमशः a::b
, ab
, या a->b
को देखकर a
और b
बारे में बहुत कुछ पता कर सकते हैं।
a::b
केवल तभी प्रयोग किया जाता है जबb
वर्ग (या नामस्थान) का सदस्य होताa
। यही है, इस मामलेa
हमेशा एक वर्ग (या नामस्थान) का नाम होगा।ab
केवल तभी प्रयोग किया जाता है जबb
वस्तु का सदस्य होता है (या किसी ऑब्जेक्ट का संदर्भ)a
। तोab
, एक कक्षा के हमेशा एक वास्तविक वस्तु (या किसी वस्तु का संदर्भ) होगा।a->b
मूल रूप से,(*a).b
।(*a).b
लिए एक शॉर्टेंड नोटेशन है। हालांकि,->
सदस्य एक्सेस ऑपरेटर का एकमात्र ऐसा है जिसे अधिभारित किया जा सकता है, इसलिए यदिa
ऐसी कक्षा का ऑब्जेक्ट है जोoperator->
(सामान्य प्रकार के स्मार्ट पॉइंटर्स और इटरेटर्स) को ओवरलोड करता है, तो इसका मतलब क्लास डिजाइनर जो भी हो कार्यान्वित किया। निष्कर्ष निकालने के लिए:a->b
, यदिa
सूचक है, तोb
वस्तु उस वस्तु का सदस्य होगा जो पॉइंटरa
संदर्भ देता है। यदि, हालांकि,a
वर्ग का एक ऑब्जेक्ट है जो इस ऑपरेटर को अधिभारित करता है, तो ओवरलोडेड ऑपरेटर फ़ंक्शनoperator->()
को शामिल किया जाता है।
छोटा प्रिंट:
- सी ++ में,
class
,struct
, याunion
रूप में घोषित प्रकारों को "वर्ग प्रकार" माना जाता है। तो उपर्युक्त उन सभी तीनों को संदर्भित करता है। - सन्दर्भ, अर्थात्, ऑब्जेक्ट्स के लिए उपनाम हैं, इसलिए मुझे # 3 पर "पॉइंटर का संदर्भ" जोड़ा जाना चाहिए था। हालांकि, मैंने सोचा कि यह सहायक से अधिक भ्रमित होगा, क्योंकि पॉइंटर्स (
T*&
) के संदर्भ शायद ही कभी उपयोग किए जाते हैं। - डॉट और तीर ऑपरेटरों का उपयोग ऑब्जेक्ट से स्थैतिक वर्ग के सदस्यों को संदर्भित करने के लिए किया जा सकता है, भले ही वे ऑब्जेक्ट के सदस्य न हों। (ओली को यह इंगित करने के लिए धन्यवाद!)
एसबीआई के बिंदु 3 के लिए एक विकल्प का सुझाव
a->b
केवल तभी प्रयोग किया जाता है जब कोई सूचक होता है। यह (*a).b
, ऑब्जेक्ट के b
सदस्य के लिए (*a).b
जो a
बिंदु है। सी ++ में दो प्रकार के पॉइंटर्स हैं, "नियमित" और स्मार्ट पॉइंटर्स। नियमित बिंदुओं जैसे कि A* a
, कंपाइलर उपकरण ->
। स्मार्ट पॉइंटर्स जैसे std::shared_ptr<A> a
, ->
क्लास shared_ptr
का सदस्य फ़ंक्शन है।
तर्क: इस एफएक्यू के लक्षित दर्शक स्मार्ट पॉइंटर्स नहीं लिख रहे हैं। उन्हें जानने की आवश्यकता नहीं है ->
वास्तव में operator->()
कहा जाता है, या यह एकमात्र सदस्य पहुंच विधि है जिसे ओवरलोड किया जा सकता है।