2012-03-07 16 views
5

this पॉइंटर कभी भी आवश्यक है? मुझे लगता है कि अगर आप this द्वारा इंगित कक्षा के उदाहरण के आसपास काम कर रहे थे तो आपको इसकी आवश्यकता होगी। लेकिन सेटिंग/पुनर्प्राप्ति/कॉलिंग/जो भी सदस्य हैं, this हमेशा वैकल्पिक है?'यह' कब आवश्यक है?

मैंने इस सी ++ को टैग किया है क्योंकि यह वह भाषा है जिसे मैं विशेष रूप से सोच रहा हूं, लेकिन अगर कोई यह पुष्टि कर सकता है कि निर्माण जावा और अन्य ओओ भाषाओं के लिए समान है जो this पॉइंटर का उपयोग करते हैं, तो इसकी सराहना की जाएगी।

उत्तर

8

जब आपके पास स्थानीय चर होता है तो सदस्य चर के समान नाम होता है। इस मामले में, स्थानीय चर को सदस्य चर को छाया करने के लिए कहा जाता है। इस स्थिति में सदस्य चर के लिए, आप this का उपयोग करना चाहिए।

कुछ लोग स्पष्ट रूप से उल्लेख करते हैं कि आप जिस चर को संशोधित कर रहे हैं, वह this का उपयोग करके सदस्य चर है, लेकिन यह हमेशा ऐसा नहीं होता है।

+0

सी ++ अपने अंतिम विचार के लिए (एक मॉडल फार्म इस माता पिता के साथ खोलने के लिए) सही है, लेकिन के लिए जावा या सी #, यह हमेशा सम्मेलन – Geoffroy

+0

नहीं है यही कारण है कि आप हमेशा अपने सदस्य का नाम आपके स्थानीय लोगों से अलग-अलग चर, उदाहरण के लिए 'm_myVar' या 'myVar_' और इसी तरह। चूंकि 'इस' का उपयोग करने से लागू नहीं किया जाता है, अधिकांश परियोजनाएं इसके बजाय सदस्य चर पर नामकरण मानक को मजबूर करने का विकल्प चुनती हैं। –

+1

मैं नहीं कहूंगा कि यह हर समय 'इस' का उपयोग करने के लिए अच्छा फॉर्म है। नामों को छाया देने पर ही इसका इस्तेमाल करें। आम तौर पर छाया भी टाला जा सकता है। –

11

तीन मामलों नहीं है मैं के बारे में सोच सकते हैं:

आप बस मौजूदा वर्ग के लिए एक सूचक पास करना चाहते हैं जब:

class B; 
struct A { 
    B* parent_; 
    A(B* parent) : parent_(parent) {} 
}; 

struct B { 
    A* a; 
    B() : a(new A(this)) {} 
}; 

एक निर्माता या सदस्य समारोह में, जहां एक सदस्य है एक तर्क द्वारा छायांकित:

struct A { 
    int a; 
    void set_a(int a) { this->a = a; } 
}; 

यहां, सदस्य चर "ए" तर्क द्वारा छायांकित है ent "a", इसलिए this-> तर्क के बजाए सदस्य तक पहुंचने के लिए उपयोग किया जाता है।

(संपादित ऊपर के उदाहरण, बल्कि निर्माता की तुलना में एक समारोह होने के लिए के बाद से आप सामान्य रूप से एक निर्माता में इस तरह से निर्दिष्ट नहीं करेंगे)


जब एक सार्वजनिक/संरक्षित सदस्य चर या एक आधार वर्ग में समारोह तक पहुँचने एक टेम्पलेट वर्ग

template <class T> 
struct A { 
    int a; 
}; 

template <class T> 
struct B : public A<T> { 
    int f() { return this->a; } 
} 

यहाँ से, a अकेले नहीं एक आश्रित नाम, होगा तो संकलक B में इसके बारे में एक घोषणा या B का एक आधार है कि निर्भर नहीं करता है खोजने के लिए उम्मीद करेंगे T पर। this-> जोड़ना this के प्रकार पर निर्भर करता है, और this एक आश्रित प्रकार है, a का लुकअप f() तत्काल है जब तक स्थगित कर दिया गया है।

return this->a के बजाय return A::a लिख सकता है, लेकिन this-> का उपयोग करके प्रत्यक्ष या अप्रत्यक्ष, कई आधारों की उपस्थिति में अधिक लचीला है। यह वैकल्पिक वाक्यविन्यास सदस्य चर और गैर वर्चुअल फ़ंक्शंस तक ही सीमित है - यदि इसका उपयोग वर्चुअल फ़ंक्शन के साथ किया जाता है, तो यह वर्चुअल फ़ंक्शन कॉल करने के बजाय फ़ंक्शन को सीधे कॉल किया जाएगा।

+0

आप इसे एक्सेस करने के लिए हमेशा classname :: variablename का उपयोग कर सकते हैं, क्योंकि इसका उपयोग इसके लिए किया जा सकता है, लेकिन यह आवश्यक नहीं है। – PlasmaHH

+0

@PlasmaHH हाँ, मैं इस सवाल को "किस परिस्थितियों में लिख रहा है" के रूप में इस बात की व्याख्या कर रहा था कि "किस स्थिति में लिखा जा रहा है" के बजाय यह 'अनावश्यक नहीं है' ' – je4d

+1

वास्तव में केवल आपका पहला उदाहरण सही है , अन्य दो के लिए 'यह' का उपयोग वैकल्पिक है। आपके दूसरे उदाहरण में, सीटीओआर प्रारंभकर्ता सूची का उपयोग idiomatic C++ है और अस्पष्टता समस्या नहीं होगी, उदा। 'ए :: ए (int ए): ए (ए) {}' मान्य है और संदिग्ध नहीं है (कम से कम संकलक के लिए)। –

-1

कभी-कभी "यह" आवश्यक है, हो सकता है कि जब आप अपना ऑब्जेक्ट किसी अन्य फ़ंक्शन पर पास कर रहे हों।इस सी # कोड में नज़र

Form1 f = new Form(); 
f.ShowDialog(this); 
+0

यह सी ++ की तरह नहीं दिखता है। – svick

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