विषय पर बढ़ें

अंतिम अद्यतन:2026-10-12

C++ this पॉइंटर

लेखक के बारे में

WeChat सार्वजनिक अकाउंट:

wechat

1.this पॉइंटर

यक़ीन है कि यहाँ मौजूद बहुत से लोग Python सीख रहे हैं, Python में self होता है, उसी तरह C++ में this पॉइंटर है, तो आइए this पॉइंटर के क्लास में उपयोग पर गहराई से विश्लेषण करते हैं!

सबसे पहले this पॉइंटर के उपयोगों पर बात करते हैं:

(1) किसी ऑब्जेक्ट का this पॉइंटर ऑब्जेक्ट का हिस्सा नहीं होता, यह sizeof(ऑब्जेक्ट) के परिणाम को प्रभावित नहीं करता।

(2) this का स्कोप क्लास के अंदर होता है, जब क्लास के non-static मेंबर फ़ंक्शन में क्लास के non-static मेंबर को एक्सेस किया जाता है, तो कंपाइलर ऑब्जेक्ट का पता अपने-आप एक implicit पैरामीटर की तरह फ़ंक्शन को पास कर देता है। यानी, भले ही आप this पॉइंटर न लिखें, कंपाइलर कंपाइल करते समय this जोड़ देता है, यह non-static मेंबर फ़ंक्शन का implicit पैरामीटर होता है, और मेंबर्स का एक्सेस this के ज़रिए होता है।

इसके बाद, this पॉइंटर का उपयोग:

(1) क्लास के non-static मेंबर फ़ंक्शन में क्लास ऑब्जेक्ट ही लौटाने के लिए, सीधे return *this का उपयोग करें।

(2) जब पैरामीटर और मेंबर वेरिएबल का नाम एक जैसा हो, जैसे this->n = n (n = n नहीं लिख सकते)।

इसके अलावा, इंटरनेट पर आप देखेंगे कि this को कंपाइलर A *const, A const * में पार्स करता है, आख़िर कौन-सा? नीचे breakpoint debugging से विश्लेषण करते हैं:

एक उदाहरण है:

#include<iostream>
#include<cstring>


using namespace std;
class Person{
public:
    typedef enum {
        BOY = 0, 
        GIRL 
    }SexType;
    Person(char *n, int a,SexType s){
        name=new char[strlen(n)+1];
        strcpy(name,n);
        age=a;
        sex=s;
    }
    int get_age() const{

        return this->age; 
    }
    Person& add_age(int a){
        age+=a;
        return *this; 
    }
    ~Person(){
        delete [] name;
    }
private:
    char * name;
    int age;
    SexType sex;
};


int main(){
    Person p("zhangsan",20,Person::BOY); 
    cout<<p.get_age()<<endl;
    cout<<p.add_age(10).get_age()<<endl;
    return 0;
}

इस सरल प्रोग्राम पर यक़ीनन किसी को समस्या नहीं होगी, एक क्लास परिभाषित की गई है, फिर कंस्ट्रक्टर से इनिशियलाइज़ किया गया, इस व्यक्ति की उम्र ली, सेट करने के बाद फिर से ली!

यह जाँचने के लिए कि this पॉइंटर कौन-सा है, अब add_age पर breakpoint लगाकर चलाते हैं, नीचे दिया गया परिणाम:

thiscontrust

genthis

दिखेगा कि कंपाइलर ने हमारे लिए अपने-आप A* const जोड़ा है, A const *this नहीं!

उसके बाद, ऊपर एक const फ़ंक्शन भी है, तो हम get_age पर breakpoint लगाते हैं, नीचे दिया गया है:

constthis

दिखेगा कि कंपाइलर ऊपर वाले this को const A* const बना देता है, यह आप सोचकर भी समझ सकते हैं, क्योंकि यह फ़ंक्शन const फ़ंक्शन है, तो const फ़ंक्शन केवल const वेरिएबल और const फ़ंक्शन ही एक्सेस कर सकता है, दूसरे वेरिएबल्स की वैल्यू नहीं बदल सकता, इसलिए एक ऐसा this चाहिए जो न बदले जा सकने वाले वेरिएबल की ओर पॉइंट करे, वह है const A*, और क्योंकि this खुद const पॉइंटर है, इसलिए यह const A* const हो जाता है!

सारांश: this मेंबर फ़ंक्शन के निष्पादन शुरू होने से पहले बनता है, मेंबर के निष्पादन ख़त्म होने पर हट जाता है। ऊपर वाला get_age फ़ंक्शन get_age(const A * const this) पार्स होगा, add_age फ़ंक्शन add_age(A* const this,int a) पार्स होगा। C++ में क्लास और स्ट्रक्चर में सिर्फ़ एक अंतर है: क्लास के मेंबर डिफ़ॉल्ट रूप से private होते हैं, जबकि स्ट्रक्चर के public। this क्लास का पॉइंटर है, अगर इसे स्ट्रक्चर से बदलें, तो this स्ट्रक्चर का पॉइंटर हो जाएगा।

संबंधित विषय

टिप्पणियाँ