तीर ऑपरेटर (->
) के लिए समानार्थी क्या है? (, ऑपरेटर ओवरलोडिंग को विषय के रूप में कोनराड का उल्लेख है, लेकिन यह है कि असामान्य है)तीर ऑपरेटर, '-> `के बजाय मैं क्या उपयोग कर सकता हूं?
a->b
(*a).b
:
तीर ऑपरेटर (->
) के लिए समानार्थी क्या है? (, ऑपरेटर ओवरलोडिंग को विषय के रूप में कोनराड का उल्लेख है, लेकिन यह है कि असामान्य है)तीर ऑपरेटर, '-> `के बजाय मैं क्या उपयोग कर सकता हूं?
a->b
(*a).b
:
निम्न दो भाव बराबर हैं।
a->b
आमतौर पर (*a).b
के लिए समानार्थी है। ऑपरेटरों की बाध्यकारी शक्ति *
और .
: *a.b
काम नहीं करेगा क्योंकि .
मजबूत बांधता है और पहले निष्पादित किया जाता है क्योंकि ब्रांड्स को बाध्यकारी होता है। यह इस प्रकार *(a.b)
के बराबर है।
ओवरलोडिंग से सावधान रहें, हालांकि: ->
और *
दोनों को अधिभारित किया जा सकता है, उनका अर्थ बहुत भिन्न हो सकता है।
मैं ज्यादातर यह सही-बाईं ओर और कॉल "में"
foo->bar->baz = qux->croak
हो जाता है पढ़ें:
"foo में पट्टी में baz qux में कर्कश हो जाता है।"
सी ++ - भाषा तीर ऑपरेटर (->
) को पॉइंटर को डिफरेंस करने के लिए समानार्थी के रूप में परिभाषित करती है और फिर उस पते पर .
-ऑपरेटर का उपयोग करती है।
उदाहरण के लिए:
यदि आपके पास एक एक वस्तु, anObject
, और एक सूचक, aPointer
:
SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;
और वस्तुओं तरीकों में से एक आप संकेतक भिन्नता का उपयोग कर सकेंगे एक ऐसा करने के लिए उस पते पर विधि कॉल:
(*aPointer).method();
कौन सा तीर ऑपरेटर के साथ लिखा जा सकता है:
+०१२३५१६४१०aPointer->method();
तीर ऑपरेटर के अस्तित्व का मुख्य कारण यह है कि यह एक बहुत ही सामान्य कार्य के टाइपिंग को छोटा करता है और पॉइंटर के डीरफ्रेंसिंग के आसपास कोष्ठक को भूलना भी आसान होता है। आप कोष्ठकों भूल गए हैं। ऑपरेटर तो मजबूत बाँध होगा * -operator और हमारे उदाहरण पर अमल के रूप में करते हैं:
*(aPointer.method()); // Not our intention!
अन्य जवाब में से कुछ भी दोनों कि सी ++ ऑपरेटरों अधिभार हो सकता है उल्लेख है और यह नहीं है कि वह आम है।
'नया SomeClass()' एक पॉइंटर ('SomeClass *') देता है, न कि 'SomeClass' ऑब्जेक्ट। और आप 'anObject' और' aPointer' घोषित करने के साथ शुरू करते हैं लेकिन आप बाद में 'p' का उपयोग कर रहे हैं। – musiphil
कुल मिलाकर यह स्पष्टीकरण सैद्धांतिक रूप से बहुत उपयुक्त है, केवल वस्तुओं का परिवर्तन इसे थोड़ा कम कर देता है। लेकिन प्रक्रिया बेहतर ढंग से वर्णित है –
C++ 0x में, ऑपरेटर एक समारोह या लैम्ब्डा अभिव्यक्ति
auto f() -> int; // "->" means "returns ..."
तकनीकी रूप से यह अब एक "ऑपरेटर" है, या यह है? –
@ मार्टिन ज्यादातर लोग "ऑपरेटर" शब्द का उपयोग कई चीजों के लिए करते हैं जिनका उपयोग मूल्यों की गणना के लिए सीधे नहीं किया जाता है। "::" ("स्कोप ऑपरेटर") की तरह। मुझे नहीं पता कि मानक के बारे में क्या दृष्टिकोण है, बिल्कुल। एक अमूर्त अर्थ में, कोई एक कार्यात्मक ऑपरेटर के रूप में "(पैरामीटर) को अनुक्रम प्रकार (पैरामीटर) के अनुक्रम प्रकार के रूप में देख सकता है, जैसे कि हैकेल ऑपरेटर, जिसे" -> "भी लिखा गया है। –
मैं आत्मसमर्पण करता हूं! :-P –
मुद्दों ओवरलोडिंग की वापसी प्रकार को इंगित करने में बहुत कम असामान्य से आपको लगता है कर रहे हैं, एक दूसरे अर्थ हो जाता है। बहुत समय पहले, एसटीएल कार्यान्वयनकर्ताओं ने कुछ इटरेटर प्रकारों के लिए '->' ऑपरेटर को ओवरलोड नहीं किया था, इसलिए आपने * * * का उपयोग किया था। कई पुस्तकालय उन्हें असंगत रूप से परिभाषित करते हैं। जब आप टेम्पलेट्स के साथ काम करते हैं और सटीक प्रकार को नहीं जानते हैं तो वास्तव में परेशान हो जाते हैं। –
आपके संपादन के बाद मुझे लगता है कि आपकी पोस्ट इसे एक अच्छे तरीके से बुलाती है। –
आप 'एक [0] भी कर सकते हैं।'(* ए)। बी' के बजाय बी '। लेकिन यह ठीक तरह से संरचित नहीं होगा। –