अंतिम अद्यतन:2026-10-12
C++ this पॉइंटर¶
लेखक के बारे में¶
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 लगाकर चलाते हैं, नीचे दिया गया परिणाम:


दिखेगा कि कंपाइलर ने हमारे लिए अपने-आप A* const जोड़ा है, A const *this नहीं!
उसके बाद, ऊपर एक const फ़ंक्शन भी है, तो हम get_age पर breakpoint लगाते हैं, नीचे दिया गया है:

दिखेगा कि कंपाइलर ऊपर वाले 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 स्ट्रक्चर का पॉइंटर हो जाएगा।
संबंधित विषय¶
- C++ प्योर वर्चुअल फ़ंक्शन और एब्स्ट्रैक्ट क्लास | C++那些事
- C++ assert | C++那些事
- C++ bit-field | C++那些事
- C भाषा से C++ पॉलीमॉर्फ़िज़्म | C++那些事
- C++ const constant और qualifier | C++那些事
- C++ const परिवार | C++那些事
- C++ dereference ऑपरेटर * | C++那些事
- C++ इनिशियलाइज़ेशन और असाइनमेंट | C++那些事
- C++ multiple return values लिखने के तरीके | C++那些事
- C++ mutable कीवर्ड | C++那些事