2010-03-18 20 views

उत्तर

12

चूंकि आप इसे टिप्पणियों में पूछ रहे हैं। क्या आप शायद स्टैंडर्ड में पाया जा सकता के लिए देख रहे हैं (5.2.5 कक्षा सदस्य पहुंच):

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

कंपाइलर सटीक उसी निर्देश का उत्पादन करेगा और यह उतना ही कुशल होगा। आपकी मशीन नहीं जान पाएगी कि आपने "->" या "*।" लिखा है या नहीं।

+0

हाँ। यही वह था जिसे मैं ढूंढ रहा था - चाहे वे नीचे हों या नहीं। – Rachel

15

[संपादित करें]

तो चर के रूप में टी * (जहां टी कुछ प्रकार है) परिभाषित किया गया है तो दोनों -> और * एक ही (जब तक ptr रिक्त है)।

यदि चर एक वर्ग (मान या संदर्भ द्वारा) का एक उदाहरण है तो -> और * को वही व्यवहार करना चाहिए (प्रति सर्वोत्तम अभ्यास) लेकिन इसके लिए कक्षा को उसी तरह अधिभारित करने की आवश्यकता होती है।

+1

-> और * अपने आप प्रकार टी पर काम नहीं करते हैं, लेकिन एक प्रकार के टी * पर, जो एक सूचक है। –

+8

यदि अंतर्निहित वर्ग * करता है * अधिभार '->' या '*' यह दोनों को अधिभारित करना चाहिए ताकि यह अभी भी वही हो। अन्यथा यह बुरी तरह से डिजाइन किया गया है। –

+0

@ ब्रायन '->' और '*' ऑपरेटर-> 'और 'ऑपरेटर *' को परिभाषित करने वाली किसी भी चीज़ पर काम करता है। * और * सभी सूचक प्रकारों पर भी। –

7

-> ऑपरेटर विशेष है कि ज्यादातर मामलों में यह अभिव्यक्ति के परिणाम तक "ड्रिल-डाउन" रिकर्सिवली है, अब ऐसा कुछ नहीं है जिस पर ओवरलोड किया गया है -> ऑपरेटर इसके लिए परिभाषित है। (*subxpression).x अभिव्यक्ति केवल उपसूचक पर एक भिन्नता है, इसलिए यदि (*subexpression) का परिणाम एक और सूचक है, तो यह संकलन नहीं होगा (आप (*(*subexpression)).x लिखने के लिए की आवश्यकता होगी एक बेहतर उदाहरण के लिए निम्न कोड देखें:।

#include <iostream> 
using namespace std; 

class MyClass 
{ 
public: 
    MyClass() : x(0) {} 
    int x; 
}; 

class MyPtr 
{ 
private: 
    MyClass* mObj; 
public: 
    MyPtr(MyClass* obj) : mObj(obj) {} 
    MyClass* operator->() 
    { 
     return mObj; 
    } 
}; 

int main() 
{ 
    MyClass obj; 
    MyClass* objCPtr = &obj; 
    MyClass** objCHandle = &objCPtr; 
    MyPtr ptr(&obj); 
    cout << ptr->x << endl; 
    cout << (*(*objCHandle)).x << endl; 
} 

नोट यह है कि इस संकलन नहीं होगा:।

cout << objCHandle->x << endl; 

वजह से ड्रिल नीचे व्यवहार -> केवल तब होता है जब अभिव्यक्ति की बाएं हाथ की ओर, एक वर्ग है struct, संघ, या सामान्य प्रकार इस मामले में, objchandle एक MyClass ** है, इसलिए यह योग्य नहीं है।

+1

@ जेरेमी: मैंने तारों को स्वरूपण आदेशों के रूप में व्याख्या करने से रोकने के लिए कई बैकटिक्स जोड़े हैं :)। –

+0

@ एंड्रयू: धन्यवाद! –

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