2010-11-24 13 views
32

वहाँसंकेतक भिन्नता ऑपरेटर ((*) बनाम ->)

(*ptr).method() 

कर बनाम

ptr->method() 

के बीच एक सामान्य अंतर है मैं एक और सवाल पर एक टिप्पणी में इस सवाल को देखा और सोचा कि मैं होगा इसे यहाँ पूछो। हालांकि मुझे अभी याद आया कि सी ++ में हर ऑपरेटर को ओवरलोड किया जा सकता है, इसलिए मुझे लगता है कि उत्तर निर्भर करेगा। लेकिन सामान्य रूप से, क्या एक दूसरे के विरुद्ध एक करने के बीच कोई अंतर है?

+0

बीटीडब्ल्यू, टिप्पणी इस प्रश्न से थी: http://stackoverflow.com/questions/4263640/find-mapped-value-of-map/4263652#4263652 :) – wrongusername

उत्तर

56

जैसा कि "जेम्सस्लिन" पहले से ही नोट किया गया है, * और -> ऑपरेटरों को कक्षा प्रकारों के लिए ओवरलोड किया जा सकता है।

और फिर दो अभिव्यक्ति (*ptr).method() और ptr->method() का अलग प्रभाव हो सकता है।

हालांकि, के लिए निर्मित ऑपरेटर दो अभिव्यक्ति समकक्ष हैं।

-> ऑपरेटर और अधिक सुविधाजनक है जब आप, संकेत की एक श्रृंखला का पालन कर रहे हैं क्योंकि .* की तुलना में अधिक पूर्वता है, इस प्रकार ungrokkable कोष्ठकों का एक बहुत आवश्यकता होती है।

पर विचार करें:

pBook->author->snailMail->zip 

बनाम
(*(*(*pBook).author).snailMail).zip 
0

वे समानार्थी हैं। उत्तरार्द्ध पूर्व के लिए एक शॉर्टेंड है।

4

लेकिन आम तौर पर, क्या एक दूसरे के विरुद्ध एक करने के बीच कोई अंतर है?

नहीं! (जब तक -> और * स्पष्ट रूप से विभिन्न कार्य करने के लिए अतिभारित रहे हैं)

ptr->method() और (*ptr).method() बराबर हैं।

+0

इन ऑपरेटरों को कक्षाओं के लिए ओवरलोड किया जा सकता है, और फिर दो अभिव्यक्तियों का अलग प्रभाव हो सकता है। नहीं!" अंतर्निहित ऑपरेटरों के लिए सही है। चीयर्स, –

+0

@ एएलएफ: 'जब तक' भाग जोड़ा गया। :) –

9

हां। ptr->method()(*ptr).method() से कम दो वर्ण हैं।

यह भी सुंदर है।

12

कच्चे सूचक प्रकार के लिए, वे बराबर हैं।

और हाँ, सामान्य प्रकार के लिए, उत्तर वास्तव में "यह निर्भर करता है", क्योंकि वर्ग operator* और operator-> को अलग-अलग व्यवहार करने के लिए अधिभारित कर सकते हैं।

+38

यदि कोई वर्ग ऐसा करता है, तो निश्चित रूप से, आप चेहरे पर लेखक को पंच करने के लिए अधिकृत हैं ... हार्ड। – jalf

1

-> अनुक्रम एक दृश्य संकेतक के रूप में कार्य करता है कि यह कुछ इंगित कर रहा है। दोनों ऑपरेटर संचालन के सटीक समान अनुक्रम करते हैं।

8

सी ++ स्टैंडर्ड 5.2.5/3:

E1 प्रकार है "वर्ग एक्स के सूचक," तो अभिव्यक्ति E1-> E2 बराबर रूप में बदल जाती है (* (ई 1)) E2।

गैर-सूचक मूल्य ऑपरेटरों के लिए अधिभारित किया जा सकता है।

2

इस पोस्ट खुदाई करने के लिए है, लेकिन फिर भी ओपी में भाव कच्चे सूचक प्रकार के लिए बराबर हैं, मुझे लगता है कि वहाँ कम से कम एक महत्वपूर्ण क्षमा करें सी ++ में उल्लिखित अंतर, जो कुछ भी कहा गया है, उसके अलावा:

विकिपीडिया से (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#cite_note-arrowptr-6):

रिटर्न प्रकार का ऑपरेटर ->() एक प्रकार होना चाहिए जिसके लिए -> ऑपरेशन लागू किया जा सकता है, जैसे पॉइंटर प्रकार। यदि एक्स प्रकार C है जहां सी अधिभार ऑपरेटर ->(), x-> y x.operator ->() -> y में विस्तारित हो जाता है।

यह संकेत मिलता है कि -> एक dereferenceable प्रकार लौटने की उम्मीद है * एक dereferenced प्रकार लौटने की उम्मीद है, और इसलिए इस "चेनिंग" केवल -> पर लागू होता है, जबकि।

+0

मुझे आपकी बात नहीं दिख रही है? अलग-अलग रिटर्न प्रकार दो ऑपरेटरों के सिंटैक्स/प्लेसमेंट में अंतर्निहित मूलभूत सत्य हैं। जैसा कि अल्फ ने दिखाया है, यह आपको '* (पीआरटी) 'के साथ वही काम करने में सक्षम नहीं है, अगर आपको पर्याप्त तारांकन और कोष्ठक टाइप करने पर परेशान किया जा सकता है। (एक वैचारिक ऑपरेटर के रूप में, '->' एक उपहार है; मैं चाहता हूं कि उसने दो अक्षरों का उपयोग न किया हो।) –

+1

मेरा मुद्दा यह है कि उनका कार्यान्वयन (और उपयोग) थोड़ा सा महत्वपूर्ण है लेकिन महत्वपूर्ण रूप से अलग है; विशेष रूप से, यह सहज नहीं हो सकता है कि '->' को "सूचक" वापस करना चाहिए, न कि "संदर्भ", और यह छोटा अंतर मौलिक कारण है कि किसी को आसानी से जंजीर क्यों बनाया जा सकता है और दूसरा नहीं (चेनिंग केवल तभी हो सकता है जब इनपुट और आउटपुट एक ही तरीके से व्यवहार करते हैं)। कुछ लोग (जैसे आप इसे प्रतीत करेंगे) व्यावहारिक उपयोग अंतर के संदर्भ में तथ्यात्मक स्पष्टीकरण पसंद करते हैं, मैं केवल मौलिक कारणों को पसंद करता हूं (जिससे मैं खुद को तथ्यात्मक अंतर प्राप्त कर सकता हूं)। – Sheljohn

+0

मैं सॉर्टा देखता हूं कि आपका क्या मतलब है, लेकिन हो सकता है कि यह अलग-अलग लोगों के लिए अलग-अलग अंतर्ज्ञानी है: दिया गया है कि '->' पॉइंटर्स में उत्पन्न होने वाले ऑपरेटर को ओवरराइड करता है, मैंने कभी भी इसे पॉइंटर (संदर्भ नहीं) प्रकार ऑब्जेक्ट पर काम करने की उम्मीद की है, और मैं _that_ मौलिक है। लेकिन मुझे यकीन है कि मैं सरल चीजों से उलझन में हूं, इसलिए प्रत्येक व्यक्ति को यह समझने में मदद करता है कि यह सब अच्छा है। –

संबंधित मुद्दे