2012-07-07 8 views
8

मैं थोड़ा सेल्सियस तक ++ नया हूँ और क्यूटी साथ चीजें काम करने के लिए कोशिश करते हैं और इस दुविधापूर्ण भर में आया था:सी ++ वर्ग वस्तु संकेत दिए गए और तक पहुँचने सदस्य कार्यों

Class *obj; 
:

विभिन्न ट्यूटोरियल राज्य कुछ की तरह पर अवधारणाओं

*obj - संदर्भित स्मृति में संग्रहीत वस्तु के मूल्य को प्रदर्शित करेगा
obj - जो करने के लिए इसे

तो इशारा कर रही है स्मृति का पता हो जाएगा, मैं somethi करना होगा यकीन नहीं क्यों, सामान्य वस्तुओं के साथ के बाद से [normalObj.function1();] काम करेगा, क्योंकि ऐसा करना है - एनजी तरह

*obj=new Class(); 

लेकिन अगर मैं एक समारोह का उपयोग करना चाहते हैं, मैं obj->function1(); *obj->function1();

के बजाय क्या करना है सीधे मूल्य।

तो, के लिए सूचक वस्तुओं कारण है कि हम समारोह, तक पहुँचने के लिए स्मृति संदर्भ का उपयोग करें या वह भी सामान्य वस्तुओं के मामले में, अपने हमेशा का संदर्भ यह है

पुनश्च: किसी ने मुझे का एक अच्छा ट्यूटोरियल के लिए मार्गदर्शन कर सकते हैं सी ++ में पॉइंटर्स का उपयोग, ताकि इन जैसे मेरे प्रश्न सीधे इसमें संबोधित किए जा सकें।

+1

[ "C++ संकेत का एक अच्छा ट्यूटोरियल"] (http://dl.dropbox.com/u/6101039/Modern%20C%2B%2B की तरह कर सकते हैं .pdf) –

उत्तर

23

* प्रतीक पॉइंटर को परिभाषित करने और पॉइंटर को कम करने के लिए उपयोग किया जाता है।उदाहरण के लिए, अगर मैं किसी पूर्णांक पर एक सूचक बनाना चाहता था, मैं कर सकता:

int *ptr;

इस उदाहरण में, * घोषित करने के लिए है कि यह एक पूर्णांक करने के लिए एक सूचक है इस्तेमाल किया जा रहा है। अब, जब आप एक पॉइंटर घोषित नहीं कर रहे हैं और आप पहले से घोषित पॉइंटर के साथ * प्रतीक का उपयोग करते हैं, तो आप इसे अस्वीकार कर रहे हैं। जैसा कि आप शायद जानते हैं, एक सूचक बस एक पता है। जब आप एक पॉइंटर को कम करते हैं, तो आप उस पते को इंगित कर रहे हैं जिस पर उस बिंदु से इंगित किया जा रहा है। उदाहरण के लिए:

int pointToMe = 5; 
int *ptr = &pointToMe; 
std::cout << *ptr; 

यह, इसके अलावा बाहर 5. प्रिंट होगा यदि आप एक नए पते पर एक सूचक बताए रहे हैं और यह घोषणा में नहीं है, आप नहीं* प्रतीक का उपयोग करते हैं। तो:

int pointToMe = 5; 
int *ptr; 
ptr = &pointToMe; 

यह है कि आप इसे कैसे करेंगे। आप पते द्वारा इंगित मूल्य पर एक नया मान निर्दिष्ट करने के लिए सूचक को भी निपुण कर सकते हैं। जैसे:

int pointToMe = 5; 
int *ptr = &pointToMe; 
std::cout << *ptr; // Prints out 5 
*ptr = 27; 
std::cout << *ptr; // Prints out 27 

अब, -> कृत्यों सम्मान प्रतीक की तरह। यह पॉइंटर को कम करेगा और उसके बाद सदस्य फ़ंक्शंस और वैरिएबल का उपयोग करेगा जैसे कि आपने गैर-पॉइंटर ऑब्जेक्ट के साथ . का उपयोग किया था। यहां तक ​​कि एक उद्देश्य यह है कि एक सूचक नहीं है के साथ आप पहली बार पता प्राप्त करके -> उपयोग कर सकते हैं:

CObj object; 
(&object)->MemberFunction(); 

सिर्फ संकेत की एक संक्षिप्त सिंहावलोकन है यही कारण है, आशा है कि यह मदद करता है।

+1

-> ऑपरेटर समझाए जाने के लिए धन्यवाद –

3

दरअसल, आप गलत हैं। आप कार्य करें:

obj=new Class(); 

या

Class *obj = new Class; 

जो पूरी तरह से अलग कर रहे हैं।

Class *obj; 
*obj = new Class; 

संकलित नहीं होगा।

objClass* प्रकार का है, तो यही है कि आप इसे असाइन कर सकते हैं (और new Class रिटर्न)।

3

आप ऑब्जेक्ट सदस्यों तक पहुंचने के लिए "सामान्य" . का उपयोग कर सकते हैं, लेकिन आपको पहले पॉइंटर को हटाना होगा।

ऑपरेटर प्राथमिकता के कारण, यह (*obj).member जैसा दिखेगा। जो लोग सोचते हैं कि यह लिखने के लिए बहुत अधिक है, obj->member एक छोटा विकल्प है।

आप एक वस्तु प्रकार Class की c, *c.ptr साधन एक सूचक ptrClass का एक सदस्य है कि अपसंदर्भन है। यह (*obj).member का एक कारण है, जिसका अर्थ कुछ और है।

0

अधिक स्पष्ट यू इस

Class obj; 
Class* obj_ptr; 

obj_ptr = &obj; 

// Now onwards you can use the pointer to access data members and function 

obj_ptr->a = 10; // Like this