2016-02-04 9 views
6

मैं "यह" सूचक समझना चाहता हूं। मैंने सोचा कि "यह" सूचक वर्ग वस्तु के मूल्य को संदर्भित करता है। हालांकि, नीचे दिए गए कोड में, मैं "इस" सूचक के विभिन्न मान दिखाई दे सकते: इस कार्यक्रम कासी ++: "इस" सूचक को समझना

#include <stdio.h> 

class InterfaceA{ 
public: 
    virtual void funa() = 0; 
}; 

class InterfaceB{ 
public: 
    virtual void funb() = 0; 
}; 

void globala(InterfaceA* obj){ 
    printf("globalA: pointer: %p\n\r",obj); 
} 
void globalb(InterfaceB* obj){ 
    printf("globalB: pointer: %p\n\r",obj); 
} 
class concrete : public InterfaceA, public InterfaceB{ 
public: 
    void funa(){ 
     printf("funa: pointer: %p\n\r",this); 
     globala(this); 
     globalb(this); 
    } 

    void funb(){ 
     printf("funb: pointer: %p\n\r",this); 
     globala(this); 
     globalb(this); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    concrete ac; 
    ac.funa(); 
    ac.funb(); 
    return 0; 
} 

आउटपुट देता है:

funa: pointer: 0x7ffff67261a0 
globalA: pointer: 0x7ffff67261a0 
globalB: pointer: 0x7ffff67261a8 
funb: pointer: 0x7ffff67261a0 
globalA: pointer: 0x7ffff67261a0 
globalB: pointer: 0x7ffff67261a8 

किसी भी मदद की इस बात को समझ सकते हैं।

धन्यवाद।

+0

मुझे लगता है कि आपका वास्तविक प्रश्न यह है कि जब एक पॉइंटर का मूल्य बदल जाता है तो यह एक फ़ंक्शन पर जाता है जो एक पॉइंटर को अलग करता है पुरानी कक्षा –

+0

मैंने आपका प्रश्न बहुत रोचक पाया, और मैंने इसे कम करने के लिए खुद को बहुत संघर्ष किया। मैंने एक विस्तारित उत्तर पोस्ट किया है, कुछ आंकड़े संबंधित (डुप्लिकेट) प्रश्न में ऑब्जेक्ट लेआउट को समझाने की कोशिश कर रहे हैं। इसे जांचने के लिए स्वतंत्र महसूस करें, यह आपकी मदद कर सकता है! – sestus

उत्तर

5

मैंने सोचा कि "यह" पॉइंटर क्लास ऑब्जेक्ट के मान को संदर्भित करता है।

सही। this हमेशा उस ऑब्जेक्ट को इंगित करता है जिस पर सदस्य फ़ंक्शन लागू होता है।

मैं "इस" सूचक

ओह अलग मान देख सकते हैं, लेकिन आप (globalA और globalB में) this मुद्रण नहीं कर रहे हैं। आप obj प्रिंट कर रहे हैं जिसमें this जैसा ही प्रकार नहीं है।

thisconcrete* प्रकार का है। जब आप इसे किसी ऐसे फ़ंक्शन पर पास करते हैं जो InterfaceB* प्रकार का तर्क लेता है, तो पॉइंटर अन्य प्रकार के लिए converted निहित है। रूपांतरण की अनुमति है क्योंकि interfaceBconcrete का आधार है। परिवर्तित सूचक अब this ऑब्जेक्ट को इंगित नहीं करेगा, लेकिन बेस क्लास उप ऑब्जेक्ट। एक उप ऑब्जेक्ट (बेस क्लास इंस्टेंस या सदस्य) हो सकता है लेकिन हो सकता है कि मुख्य ऑब्जेक्ट के समान पता न हो। किसी ऑब्जेक्ट की उप ऑब्जेक्ट्स कोई पता साझा नहीं कर सकती है, इसलिए अधिकांश एक ऑब्जेक्ट में मुख्य ऑब्जेक्ट के समान पता हो सकता है - empty base optimization के मामले में छोड़कर।

0

this एक सूचक है जो उस सदस्य को संदर्भित करता है जो सदस्य फ़ंक्शन का आह्वान करता है।

this का प्रकार सदस्य फ़ंक्शन पर निर्भर करता है।

एक class X के लिए

उदाहरण के लिए, यदि सदस्य कार्यों

1) स्थिरांक, तो this प्रकार का है const X*

2) अस्थिर है, तो this है volatile X*

है अन्यथा यह

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