2010-11-28 15 views
5

शायद आपको खरीदा गया है, खुद को खरीदा है, वह। और ->ऑपरेटर हैं जो एक संरचना (सी) या कक्षा (सी ++) के सदस्यों को पुनर्प्राप्त करते हैं।हैं। और -> सी और सी ++ वास्तव में ऑपरेटरों में?

हालांकि, मुझे संदेह है कि वे ऑपरेटर हैं - क्योंकि, यदि वे ऑपरेटर हैं, तो उनके इनपुट प्रकार क्या हैं? इसके अलावा, दोनों तरफ के पहचानकर्ता एक दूसरे पर निर्भर हैं - एक सुविधा जो उदाहरण के लिए + ऑपरेटर की कमी है।

यदि यह सही है - इन्हें अभी भी अभ्यास में ऑपरेटर के रूप में लेबल किया गया है, और भाषा सिद्धांत के संबंध में उनकी औपचारिक परिभाषा क्या है।

+1

* पढ़ाया *। । । । – Inverse

उत्तर

1

इस संदर्भ कहते हैं कि वे C++ दोनों ऑपरेटरों कर रहे हैं:

http://www.cplusplus.com/doc/tutorial/operators/

पर्याप्त आधिकारिक कि नहीं है?

+0

धन्यवाद, यह है। उदाहरण के लिए एक ही प्रश्न कहा जा सकता था प्रकार-कास्टिंग, स्कोप संकल्प, जो मानक ऑपरेटरों के रूप में सम्मान करता है। फिर भी, मैं उन ऑपरेटरों के साथ असहज रहता हूं जिनके पास सामान्य रूप से फ़ंक्शन प्रोटोटाइप नहीं होता है। – shuhalo

+0

http: // stackoverflow का अंतिम पैराग्राफ भी देखें।कॉम/प्रश्न/104618/what-does-mean-in-f/105559 # 105559 – Brian

+3

जैसा कि मैंने एक और टिप्पणी में कहा - प्राधिकरण से अपील व्यापक रूप से मान्यता प्राप्त अवैध तर्क है। यह संभव है कि सी ++ मानकों की समिति और भाषा को परिभाषित करने में शामिल लोगों ने अपने शब्दों को बुरी तरह चुना। इस मामले में उन्होंने नहीं किया, लेकिन अभी भी कहने के लिए अभी भी कमरा है * क्यों * शब्द उचित है, बस इतना कहने के बजाय "ऐसा और ऐसा कहता है"। – Steve314

1

आप -> ऑपरेटर: Wikipedia ओवरलोड कर सकते हैं। वह पृष्ठ यह भी बताता है कि आप डॉट ओवरलोड नहीं कर सकते हैं। वहाँ का एक उदाहरण है ->here अधिक भार:

class String // this is handle 
{ 
    ... 
    Stringrep *operator ->() const { return b_; } 
    private: 
    Stringrep *b_; 
} 

तीर तीर और रिटर्न है जो कुछ भी बाएं हाथ की ओर "अंदर पकड़" के बाईं ओर मूल्य पर काम करता है। smart pointer के बारे में सोचें।

5

मुझे लगता है कि आप "ऑपरेटर" कीवर्ड का उपयोग कर -> ऑपरेटर को अधिभारित कर सकते हैं, यह एक मृत देनदार होना चाहिए।

स्मार्ट संकेत बहुत अक्सर यह कार्य करें:

template<class T> 
struct myPtr { 
    T *operator ->() { return m_ptr; } 

    private: 
     T *m_ptr; 
}; 

. overloadable नहीं है, लेकिन यह भी परिभाषा से एक ऑपरेटर है।

1

THe C++ 03 मानक ऑपरेटरों के रूप में दोनों को संदर्भित करता है।

उदाहरण:

... के बाद। ऑपरेटर अपने वर्ग के प्रकार की अभिव्यक्ति के लिए आवेदन किया ...

आपको लगता है कि शब्दावली आप . के लिए अवधि punctuator उपयोग कर सकते हैं के साथ सहज नहीं हैं।

6

आप मानते हैं कि एकमात्र प्रकार जो ऑपरेटर को तर्क के रूप में पारित किया जा सकता है वे प्रकार हैं जिन्हें भाषा के भीतर परिभाषित किया जा सकता है।

मैं तर्क दूंगा कि संकलक द्वारा पहचाने जाने वाले किसी भी प्रकार को "पहचानकर्ता" जैसे आंतरिक प्रकारों सहित एक तर्क के रूप में पारित किया जा सकता है। ऑपरेटर के पास एएसटी प्रतिनिधित्व में दो तर्क होंगे, जो आपको सेमेन्टिक्स को परिभाषित करने के लिए पर्याप्त है।

एक अन्य तर्क यह है कि भाषा सिद्धांत आपके शब्दावली के लिए परिभाषाओं का एक सेट प्रदान कर सकता है, लेकिन यह केवल एकमात्र नहीं है।

उदाहरण के लिए, एक ऑपरेटर एक ऐसा व्यक्ति हो सकता है जो मशीन का काम करता हो। उस परिभाषा के प्रोग्रामिंग सिद्धांत के लिए कोई प्रासंगिकता नहीं है, लेकिन यह मुझे डोमेन ऑपरेटिंग के साथ कुछ करने के लिए व्यक्त डोमेन-विशिष्ट भाषा में कीवर्ड के लिए उपयोग नहीं करेगा।इसी तरह, शब्द "ऑपरेटर" की गणित में व्यापक परिभाषा है जो कि प्रोग्रामिंग सिद्धांत के लिए विशिष्ट है - और यह परिभाषा केवल प्रोग्रामिंग भाषा के साथ काम करके अवैध नहीं है।

इसे एक और तरीका रखने के लिए - यदि आपने इसे ऑपरेटर नहीं कहा है, तो क्या आप इसे कॉल करेंगे?

संपादित

स्पष्ट करने के लिए, मेरा पहला तर्क ऑपरेटर (कॉल) का उपयोग करने के लिए वाक्य रचना करने के लिए बात कर रहा है। इन ऑपरेटरों के पास सही तर्क हैं जो पहचानकर्ता हैं - सदस्य नाम - जो सी ++ भाषा डेटा प्रकार का उपयोग करके व्यक्त नहीं कर सकती है। सी ++ भाषा में सदस्य पॉइंटर्स हैं, लेकिन वे सदस्य के समान नहीं हैं - जैसे वैरिएबल उस चर के सूचक के समान नहीं है।

मुझे लगता है कि सवाल यही है। उन ऑपरेटरों के सही पैरामीटर में एक प्रकार है जिसे सामान्य रूप से भाषा में व्यक्त या छेड़छाड़ नहीं किया जा सकता है।

क्या होता है जब उस वाक्यविन्यास को ओवरलोडेड operator-> फ़ंक्शन पर मैप किया जाता है तो यह एक अलग बात है। फ़ंक्शन ऑपरेटर नहीं है - यह केवल ऑपरेटर को लागू करने का तरीका है।

3

हम्म ... sizeof एक ऑपरेटर है, इसका इनपुट प्रकार क्या है? मुझे नहीं लगता कि इस संदर्भ में ऑपरेटरों को गैर-ऑपरेटरों से अलग करने के लिए प्रश्न उपयोगी है।

और कि होगा, क्योंकि जो "ऑपरेटर" एक प्रोग्रामिंग भाषा के संदर्भ में इसका मतलब है बिल्कुल है क्या भाषा के लेखक कहते हैं इसका मतलब है। लुईस कैरोल के रंग यहां।

+0

प्रोग्रामिंग सिद्धांत शब्दों में, ज़ाहिर है, आकार को एक समारोह माना जाने की अधिक संभावना है। रन-टाइम की बजाय संकलन-समय पर कार्य करना बिंदु के अलावा है। उपयोगकर्ता/लाइब्रेरी फ़ंक्शन के बजाय एक कंपाइलर-आंतरिक होने के कारण बिंदु के अलावा है। और तथ्य यह है कि तर्क प्रकार "डेटाटाइप" है - एक प्रकार जिसे आप अपने कार्यों के पैरामीटर के रूप में पास नहीं कर सकते - यह भी बिंदु के अलावा है, चाहे आकार एक कार्य या ऑपरेटर है। सी और सी ++ के मानक और शब्दकोष अपने इतिहास के साथ वैकल्पिक परिभाषा देते हैं, लेकिन लुईस कैरोल भी क्रेटिलस से संबंधित मजाक बना रहा था। – Steve314

+0

बीटीडब्ल्यू - मैंने अभी भी आपको लुईस कैरोल संदर्भ के लिए +1 दिया है। मेरे पास होने वाली छोटी असहमति के लिए बहुत प्रासंगिक है। – Steve314

+0

@ स्टीव 314: "फ़ंक्शन" (जिसमें 'sizeof' शामिल है) की ऐसी परिभाषा ऑपरेटर की तुलना में थोड़ा अलग प्रतीत होती है - '+' ऑपरेटर को समान रूप से "फ़ंक्शन" कहा जा सकता है। – caf

1

ऑनलाइन सी मानक (n1256):

6.5.2.3 संरचना और यूनियन के सदस्यों

प्रतिबन्ध

ऑपरेटर के पहले संकार्य एक योग्य या अयोग्य संरचना होगा या संघ प्रकार, और दूसरा ऑपरेंड उस प्रकार के सदस्य का नाम देगा।

ऑपरेटर 'योग्य या अयोग्य संघ के सूचक' '' या 'योग्य या अयोग्य संरचना करने के लिए सूचक' 'प्रकार' होगा की पहली संकार्य, और दूसरा संकार्य करेगा नाम प्रकार के एक सदस्य उठाई सेवा मेरे।

वे ऑपरेटर हैं, और उनके इनपुट प्रकार मानक द्वारा निर्दिष्ट किए जाते हैं।

0

हाहा, मुझे पता है कि लोगों ने पहले ही इसे एक चौराहे के रास्ते में कहा है, लेकिन इसे सीधे कहने के लिए। सी शर्तों में, लेबल-> वास्तव में (* लेबल) के लिए एक लघुरूप है। ।ऐसा कहे जाने के बाद, । ऑपरेटर है जो एक संरचना में तत्वों का संदर्भ देता है। इसलिए, -> एक सूचक में एक तत्व में एक तत्व संदर्भित करता है।

+0

सी शर्तों में हाँ, लेकिन टैग में सी ++ शामिल हैं। अधिभारित होने पर, 'ऑपरेटर-> 'ऑपरेटर * से अलग होता है, इसलिए" शॉर्टेंड "तर्क आवश्यक रूप से लागू नहीं होता है। उस ने कहा, यह सुनिश्चित करने के लिए अभी भी अच्छा अभ्यास है कि शॉर्टंड प्रभावी रूप से लागू होता है - यदि आप 'ऑपरेटर->' और 'ऑपरेटर *' को अधिभारित करते हैं, तो आपको लगातार उन्हें अधिभारित करना चाहिए (और अपेक्षित पॉइंटर-जैसे अर्थशास्त्र के साथ)। – Steve314

+0

सच है, मैं सी शर्तों में बात कर रहा था। हालांकि, मैं ओवरलोडिंग पर विचार करता हूं -> सी ++ में बहुत खराब अभ्यास होना। – chacham15

+0

मैं वास्तव में सहमत हूं। कुछ असंगतताएं होती हैं जो स्मार्ट पॉइंटर्स और इटरेटर्स आमतौर पर केवल ऑपरेटर * को लागू करती हैं। अगर -> सिर्फ एक शॉर्टेंड था - जब यह समझ में आता था तब हमेशा उपलब्ध होता था, और ऑपरेटर की आवश्यकता नहीं होती-> - यह कुछ परेशानी से बच जाएगी। – Steve314

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