मैं तीर ऑपरेटर के बजाय क्या उपयोग कर सकता हूं, `->`?


112

एरो ऑपरेटर ( ->) का पर्यायवाची क्या है ?

जवाबों:


148

निम्नलिखित दो भाव समतुल्य हैं:

a->b

(*a).b

(कोनराड के रूप में ऑपरेटर ओवरलोडिंग के अधीन है, लेकिन यह असामान्य है)।


9
ओवरलोडिंग मुद्दे आपके विचार से बहुत कम असामान्य हैं। बहुत पहले नहीं, एसटीएल कार्यान्वयनकर्ताओं के पास ->कुछ इटैलर प्रकारों के लिए कोई अतिभारित ऑपरेटर नहीं था, इसलिए आपको इसका उपयोग करना था*. । कई पुस्तकालय उन्हें असंगत रूप से परिभाषित करते हैं। जब आप टेम्प्लेट के साथ काम करते हैं और सटीक प्रकार नहीं जानते हैं तो वास्तव में कष्टप्रद हो जाता है।
कोनराड रुडोल्फ

1
आप a[0].bइसके बजाय भी कर सकते हैं (*a).b। लेकिन यह ठीक से संरचित नहीं होगा।
सेलोरियो

2
लड़का, कई वर्षों के c # प्रोग्रामिंग के बाद, c ++ में वापस जाना केवल संज्ञानात्मक कर नहीं है, c ++ सिंटैक्स सिर्फ बदसूरत और yucky है। मुझे ऐसा लगता है कि इसे इस्तेमाल करने के बाद शॉवर लेना चाहिए। C और c ++ में लिखे प्रोग्राम सिर्फ खराब प्रोग्रामिंग को प्रोत्साहित करते हैं। एपल, पूर्व-यूनिक्स, भाषा को पास्कल के रूप में सुंदर बनाने के लिए संघर्ष करते थे।
ATL_DEV

@ATL_DEV मैं तर्क दूंगा कि बहुत अधिक बदसूरत सामान अब मुहावरेदार नहीं माना जाता है, लेकिन दुर्भाग्य से इसका मतलब यह नहीं है कि आप इसका अभ्यास C ++ प्रोग्रामर के रूप में नहीं कर सकते। इसके अलावा वाक्यविन्यास अच्छा पथ अक्सर शब्दार्थ अच्छा मार्ग नहीं है, लेकिन यह भी बेहतर नहीं बदतर हो रही है। लेकिन फिर मेरे पास सी ++ स्टॉकहोम सिंड्रोम है।
टिम सेगिन

@TimSeguine यदि आप कभी सुंदर कोड देखना चाहते हैं, तो Macintosh के अंदर के दस्तावेज़ देखें। मुझे लगता है कि उन्होंने CamelCase का आविष्कार किया। बहुत वर्णनात्मक चर नाम और सुरुचिपूर्ण ढंग से प्रारूपित कोड। वे अपने बाद के सी कोड को लगभग अपने पहले पास्कल कोड के रूप में भव्य बनाने में कामयाब रहे।
ATL_DEV

70

a->bआम तौर पर एक पर्यायवाची है (*a).b। यहाँ parenthesises आवश्यक ऑपरेटरों के बंधन ताकत की वजह से कर रहे हैं *और .: *a.bकाम नहीं होगा क्योंकि .मजबूत बांधता है और पहले निष्पादित किया जाता है। यह इस प्रकार के बराबर है *(a.b)

, अधिक भार से सावधान रहें, हालांकि: चूंकि दोनों ->और *अतिभारित किया जा सकता, उनके अर्थ काफी अंतर आ सकता है।


1
आपके द्वारा binding strengthऑपरेटर पूर्वता का मतलब है? यदि नहीं तो दोनों में क्या अंतर है?
विष्णुप्रशांत

1
@Vizkrig हाँ, दो शब्दों का इस्तेमाल एक-दूसरे के लिए किया जाता है (हालाँकि "ऑपरेटर पूर्वता" बहुत अधिक लगातार लगता है, कम से कम हाल के वर्षों में)।
कोनराड रुडोल्फ

45

C ++ - भाषा तीर संचालक को परिभाषित करती है ( ->) एक पॉइंटर को .डीफ़्रैन्फ़ायर करने के लिए एक पर्याय के रूप में और फिर उस पते पर -ओपरेटर का उपयोग करें ।

उदाहरण के लिए:

यदि आपके पास एक ऑब्जेक्ट anObjectऔर एक पॉइंटर है aPointer:

SomeClass anObject = new SomeClass();
SomeClass *aPointer = &anObject;

ऑब्जेक्ट्स में से एक का उपयोग करने में सक्षम होने के लिए आप पॉइंटर को डीरेंस करें और उस एड्रेस पर एक मेथड कॉल करें:

(*aPointer).method();

जिसे तीर ऑपरेटर के साथ लिखा जा सकता है:

aPointer->method();

तीर ऑपरेटर के अस्तित्व का मुख्य कारण यह है कि यह एक बहुत ही सामान्य कार्य के टाइपिंग को छोटा करता है और यह पॉइंटर को डेरेफ़रिंग के आसपास के कोष्ठकों को भूल जाना भी आसान है। यदि आप कोष्ठक को भूल गए हैं तो ऑपरेटर मजबूत हो जाएगा और फिर * -ऑपरेटर और हमारे उदाहरण को निष्पादित करेगा:

*(aPointer.method()); // Not our intention!

कुछ अन्य जवाबों में दोनों का उल्लेख भी है कि C ++ ऑपरेटर्स ओवरलोड हो सकते हैं और यह आम नहीं है।


8
new SomeClass()एक सूचक ( SomeClass *) लौटाता है , SomeClassवस्तु नहीं । और आप घोषणा के साथ शुरू करते हैं anObjectऔर aPointerआप pबाद में उपयोग कर रहे हैं ।
मुसीफिल 17

कुल मिलाकर यह स्पष्टीकरण सैद्धांतिक रूप से बहुत उपयुक्त है, केवल वस्तुओं का परिवर्तन इसे थोड़ा जटिल बनाता है। लेकिन इस प्रक्रिया का बेहतर वर्णन किया गया है
कोड मैन

17

C ++ 0x में, ऑपरेटर को एक दूसरा अर्थ मिलता है, जो फ़ंक्शन या लैम्ब्डा अभिव्यक्ति के रिटर्न प्रकार को दर्शाता है

auto f() -> int; // "->" means "returns ..."

1
तकनीकी रूप से स्पेकिंग करना अब वहां "ऑपरेटर" नहीं है, या यह है?
मार्टिन बा

6
@ अधिकांश लोग "ऑपरेटर" शब्द का उपयोग कई चीजों के लिए करते हैं जो सीधे कंप्यूटिंग मूल्यों के लिए उपयोग नहीं किए जाते हैं। जैसे "::" ("स्कोप ऑपरेटर")। मुझे नहीं पता कि मानक का दृष्टिकोण इस पर क्या है, बिल्कुल। एक अमूर्त अर्थ में, एक "->" एक कार्यात्मक ऑपरेटर के रूप में एक रिटर्न प्रकार के प्रकार (मापदंडों) की मैपिंग कर सकता है, जैसे हैसेल ऑपरेटर, जो "->" भी लिखा जाता है।
जोहान्स शाउब -

6
मैं समर्पण करता हूँ! :-P
मार्टिन बा

2
@ जोहान्सचैब-लिटब: ::वास्तव में एक ऑपरेटर है, जैसे , .या ->मानक में "गुंजाइश रिज़ॉल्यूशन ऑपरेटर" कहा जाता है।
मुशीफिल 18

13

मैं ज्यादातर इसे दाएं-बाएं पढ़ता हूं और "इन" कहता हूं

foo->bar->baz = qux->croak

हो जाता है:

"foo में बार में baz qux में बदमाश बन जाता है।"


1

-> उस डेटा का उपयोग करते समय उपयोग किया जाता है जिसे आपने एक पॉइंटर को प्राप्त किया है।

उदाहरण के लिए, आप इस तरह के int intar के प्रकार के चर के लिए एक पॉइंटर ptr बना सकते हैं:

int* prt = &intVar;

आप तब किसी फ़ंक्शन का उपयोग कर सकते हैं, जैसे कि foo, उस पर केवल उस सूचक को dereferencing द्वारा - उस चर पर फ़ंक्शन को कॉल करने के लिए, जो सूचक उस चर की स्मृति स्थान के संख्यात्मक मान के बजाय, उस बिंदु पर इंगित करता है:

(*ptr).foo();

यहाँ कोष्ठक के बिना, *(ptr.foo())संचालक इसे पूर्ववर्ती संज्ञा की वजह से समझेंगे जो कि हम नहीं चाहते।

यह वास्तव में टाइपिंग जैसा ही है

ptr->foo();

के रूप में ->dereferences कि सूचक, और कॉल समारोह इतना foo()चर जो सूचक हमारे लिए की ओर इशारा करते है पर।

इसी तरह, हम ->किसी वर्ग के सदस्य तक पहुँचने या सेट करने के लिए उपयोग कर सकते हैं :

myClass* ptr = &myClassMember;
ptr->myClassVar = 2; 

0

आप एक फ़ंक्शन को परिभाषित करने के लिए -> का उपयोग कर सकते हैं।

auto fun() -> int
{
return 100;
}

यह लंबोदर नहीं है। यह वास्तव में एक समारोह है। "->" फ़ंक्शन के रिटर्न प्रकार को इंगित करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.