उत्तर
चूंकि आप इसे टिप्पणियों में पूछ रहे हैं। क्या आप शायद स्टैंडर्ड में पाया जा सकता के लिए देख रहे हैं (5.2.5 कक्षा सदस्य पहुंच):
3 E1 प्रकार है "वर्ग एक्स के सूचक," तो अभिव्यक्ति E1-> E2 है बराबर रूप में परिवर्तित (* (ई 1))। ई 2;
कंपाइलर सटीक उसी निर्देश का उत्पादन करेगा और यह उतना ही कुशल होगा। आपकी मशीन नहीं जान पाएगी कि आपने "->" या "*।" लिखा है या नहीं।
[संपादित करें]
तो चर के रूप में टी * (जहां टी कुछ प्रकार है) परिभाषित किया गया है तो दोनों -> और * एक ही (जब तक ptr रिक्त है)।
यदि चर एक वर्ग (मान या संदर्भ द्वारा) का एक उदाहरण है तो -> और * को वही व्यवहार करना चाहिए (प्रति सर्वोत्तम अभ्यास) लेकिन इसके लिए कक्षा को उसी तरह अधिभारित करने की आवश्यकता होती है।
-> और * अपने आप प्रकार टी पर काम नहीं करते हैं, लेकिन एक प्रकार के टी * पर, जो एक सूचक है। –
यदि अंतर्निहित वर्ग * करता है * अधिभार '->' या '*' यह दोनों को अधिभारित करना चाहिए ताकि यह अभी भी वही हो। अन्यथा यह बुरी तरह से डिजाइन किया गया है। –
@ ब्रायन '->' और '*' ऑपरेटर-> 'और 'ऑपरेटर *' को परिभाषित करने वाली किसी भी चीज़ पर काम करता है। * और * सभी सूचक प्रकारों पर भी। –
->
ऑपरेटर विशेष है कि ज्यादातर मामलों में यह अभिव्यक्ति के परिणाम तक "ड्रिल-डाउन" रिकर्सिवली है, अब ऐसा कुछ नहीं है जिस पर ओवरलोड किया गया है -> ऑपरेटर इसके लिए परिभाषित है। (*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 ** है, इसलिए यह योग्य नहीं है।
@ जेरेमी: मैंने तारों को स्वरूपण आदेशों के रूप में व्याख्या करने से रोकने के लिए कई बैकटिक्स जोड़े हैं :)। –
@ एंड्रयू: धन्यवाद! –
हाँ। यही वह था जिसे मैं ढूंढ रहा था - चाहे वे नीचे हों या नहीं। – Rachel