डॉट और एरो ऑपरेटर दोनों का उपयोग C++ में क्लास के मेंबर्स को एक्सेस करने के लिए किया जाता है। वे केवल अलग-अलग परिदृश्यों में उपयोग किए जाते हैं। C++ में, क्लास, स्ट्रक्चर, या यूनियन के रूप में घोषित प्रकारों को "क्लास टाइप का" माना जाता है। इसलिए निम्नलिखित उन दोनों को संदर्भित करता है।
a.bकेवल तभी उपयोग किया जाता है यदि b ऑब्जेक्ट (या रेफरेंस[1] से ऑब्जेक्ट) a का मेंबर है। इसलिए a.b के लिए, a हमेशा एक वास्तविक ऑब्जेक्ट (या क्लास के ऑब्जेक्ट का रेफरेंस) होगा।a->bअनिवार्य रूप से(*a).bके लिए एक संक्षिप्त नोटेशन है, यानी यदि a एक ऑब्जेक्ट का पॉइंटर है, तो a->b उस ऑब्जेक्ट की प्रॉपर्टी b को एक्सेस कर रहा है जिस पर a इंगित करता है।
ध्यान दें कि . ओवरलोडेबल नहीं है। -> एक ओवरलोडेबल ऑपरेटर है, इसलिए हम अपना खुद का फ़ंक्शन (operator->()) परिभाषित कर सकते हैं जिसे इस ऑपरेटर के उपयोग पर कॉल किया जाना चाहिए। इसलिए यदि a एक ऐसे क्लास का ऑब्जेक्ट है जो operator-> को ओवरलोड करता है (ऐसे सामान्य प्रकार स्मार्ट पॉइंटर्स और इटरेटर्स हैं), तो अर्थ वही है जो क्लास डिजाइनर ने कार्यान्वित किया है।
[1] रेफरेंस, अर्थपूर्ण रूप से, ऑब्जेक्ट्स के उपनाम हैं, इसलिए मुझे #3 में "या पॉइंटर का रेफरेंस" भी जोड़ना चाहिए था। हालांकि, मुझे लगा कि यह भ्रमित करने से अधिक सहायक होगा क्योंकि पॉइंटर्स के रेफरेंस (T*&) शायद ही कभी उपयोग किए जाते हैं।
उदाहरण
#include<iostream>
class A {
public:
int b;
A() { b = 5; }
};
int main() {
A a = A();
A* x = &a;
std::cout << "a.b = " << a.b << "\n";
std::cout << "x->b = " << x->b << "\n";
return 0;
}
आउटपुट
इससे निम्न आउटपुट मिलेगा:
5 5