2010-05-29 13 views
7

संभावित डुप्लिकेट (->)
C++: ptr->hello(); /* VERSUS */ (*ptr).hello();
Why does C have a distinction between -> and . ?-> और के बीच अंतर के लिए तर्क क्या है। सी/सी ++ में? (।):

मैं सूचक ऑपरेटर द्वारा सदस्य ऑपरेटर और सदस्य के बीच अंतर पता है।

सी डिजाइनर इस पहुंच के लिए एक अलग ऑपरेटर क्यों बनाते थे? संकलक इसे अपने आप क्यों नहीं समझ सकता?

यदि आप हमेशा इस्तेमाल करते हैं। क्या कोई मामला मौजूद है जहां यह संदिग्ध है कि क्या आप सदस्य या सदस्य द्वारा सूचक हैं?

संपादित करें: मैं "(* ए) .b" वाक्यविन्यास की तलाश नहीं कर रहा हूं। मैं पूछता हूं कि डिजाइनरों ने आपको "ए-> बी" के बजाय "ए.बी." का उपयोग करने की अनुमति क्यों नहीं दी?

+0

नोटेशन मूल रूप से सी –

+0

से आता है अच्छा बिंदु: मैंने सी ++ के बजाय सी का उपयोग करने के लिए प्रश्न बदल दिया। –

+0

संभावित डुप्लिकेट [सी ++: पीआरटी-> हैलो();/* VERSUS */(* ptr) .hello();] (http://stackoverflow.com/questions/447543/c-ptr-hello-versus-ptr-hello) और [।) के बीच क्या अंतर है डॉट ऑपरेटर और (->) तीर सी ++ में तीर] (http://stackoverflow.com/questions/1238613/what-is-the-difference-between-dot-operator-and-arrow-in-c) –

उत्तर

0

जब आपके पास एक कोर है, जिसका मूल "पोर्टेबल असेंबलर" होना है, तो आप उपयोगकर्ता से कार्यान्वयन विवरण छिपाने की कोशिश नहीं करते हैं। बेशक संकलक यह पता लगा सकता है कि अभिव्यक्ति में a.ba प्रश्न में एक सूचक है। क्या आप? मज़बूती से? पुरे समय? बालों में, जटिल कोड?और क्या आप ऐसी परिस्थिति की कल्पना नहीं कर सकते हैं जहां a जल्दी से यह नोट करने में सक्षम न हो कि कोई सूचक समस्या हो सकती है?

"लिखने में कठोर" के संदर्भ में सोचना बंद करें और "पढ़ने में आसान" के संदर्भ में सोचना शुरू करें। (हाँ, मुझे पता है। यह पूरे सी प्रोग्रामर मिथकों के खिलाफ चला जाता है!) आप इसे लिखने के बजाय अक्सर परिमाण के कुछ आदेश कोड पढ़ेंगे।

6

क्या आप वास्तव में संकलक को "इसे अपने आप समझने" चाहते हैं? अगर ऐसा हुआ, तो निम्न एक ही बात करने के लिए मूल्यांकन करेगा (यह मानते हुए p एक सदस्य x के साथ एक struct के लिए सूचक है): यदि सूचक की dereferencing वहाँ निहित है

(*p).x; 
p.x 

, यह अंतर्निहित होना चाहिए हर जगह? विचार करें:

int* p; 
int i = p; // should dereferencing be implicit here as well? 

मुझे लगता है कि दो अलग ऑपरेटरों की तुलना में कहीं अधिक भ्रमित होगा।

यह भी सहायक हो सकता है कि दो ऑपरेटरों को आपके पास संकेतों की कितनी परतों का ट्रैक रखने में मदद मिल सके। अनुमोदित, -> ऑपरेटर इस के लिए कड़ाई से जरूरी नहीं है, क्योंकि p->x(*p).x के बराबर है, लेकिन यह कोड को थोड़ा स्पष्ट और पढ़ने में आसान बनाता है।

+0

आपको यह भी विचार करना होगा कि क्या होना चाहिए जब संकेत के अतिरिक्त स्तर शामिल होते हैं: क्या आप कंपाइलर को '.' का उपयोग करते समय मनमानी गहराई के 'संरचना' पॉइंटर्स को हटाना चाहते हैं, या इसे किसी एक पर प्रतिबंधित करना चाहते हैं संकेत का स्तर? न तो समाधान मुझे 'सही' लगता है ... – Christoph

+0

ठीक है, क्योंकि यह (''> 'और' :: '' के लिए केवल '.' है, यह कुछ भाषाओं में कैसे किया जाता है, यह संभव है। और ऐसा लगता है कि उन भाषाओं से सी या सी ++ में आने वाले लोग इसे अलग-अलग करने के लिए उलझन में पाते हैं। – sbi

+0

यह भी देखें [यह उत्तर] (http://stackoverflow.com/questions/2843916/c-help-about-class-and-error-c3861/2843960#2843960)। – sbi

2

हाँ अस्पष्टता दोनों ऑपरेटरों ओवरराइड करने के लिए सक्षम किया जा रहा से आता है। सर्वश्रेष्ठ उदाहरण शायद shared pointers हैं। एक साझा सूचक का उपयोग किया जा सकता है। और -> ऑपरेटरों और दोनों के अलग-अलग अर्थ हैं।

के साथ -> आप जिस ऑब्जेक्ट की ओर इशारा करते हैं उस तक पहुंचते हैं। आप साझा पॉइंटर के सदस्यों तक पहुंच सकते हैं।

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

class MyObject { 
public: 
    void myFunction() {} 
}; 
boost::shared_ptr<MyObject> ptr; 
ptr.use_count(); // calls use_count, which is a member of boost::shared_ptr. 
ptr->myFunction(); // calls MyObject::myFunction, as the operator-> is overriden 
-1

दोनों fo->bar और (*fo).bar एक ही बात करते हैं!

भाषा केवल अप्रत्यक्ष पहुंच के लिए ऑपरेटर प्रदान करती है, अर्थात् तीर (->) और इसे एक प्रतीक के रूप में मानती है।

+0

यह क्यों उखाड़ फेंका गया था? यह सवाल का जवाब नहीं देता है। –

+0

@ अच्छा वास्तव में, आपने अपना प्रश्न संपादित किया! – Secko

-1

-> ऑपरेटर किसी ऑब्जेक्ट की विधि या सदस्य को इसके सूचक द्वारा संदर्भित करने का एक आसान तरीका है (* p)। मेम्बर या (* पी)। विधि।

उदाहरण:

MyClass * MyObj;

MyObj-> विधि(); (* MyObj) .method() से पढ़ने और समझने के लिए बेहतर है;

0

सी ++ आपको -> ऑपरेटर को ओवरराइड करने देता है। जब आपके पास std::auto_ptr जैसे स्मार्ट पॉइंटर क्लास हो, तो वही चर . और दोनों का समर्थन कर सकता है, जिस पर आप का उपयोग auto_ptr के सदस्यों तक पहुंचने के लिए करते हैं, और -> जिसमें पॉइंटर के सदस्यों तक पहुंच है।

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