2016-02-04 90 views
6

我想了解“this”指针。我认为“this”指针指向类对象的值。 然而,在下面的代码,我可以看到的 “this” 指针的不同值:C++:了解“this”指针

#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

我认为你的实际问题是什么时候以及为什么当一个指针的值传递给一个指向一个dif的函数不同阶层。 –

+0

我发现你的问题非常有趣,我非常挣扎,为了不让这个问题得到解决。我发布了一个扩展的答案,其中一些数字试图解释相应(重复)问题中的对象布局。随时检查它,它可能会帮助你! – sestus

回答

5

我认为“这个”指针指的是类对象的值。

正确。 this总是指向调用成员函数的对象。

我能看到的 “this” 指针

哦不同的价值观,但你不打印this(在globalAglobalB)。您正在打印obj,它甚至没有与this相同的类型。

this的类型为concrete*。当你将它传递给一个带有参数类型为InterfaceB*的函数时,该指针隐含地指向另一个类型的converted。允许转换,因为interfaceBconcrete的基础。转换的指针将不再指向this对象,而是一个基类子对象。子对象(基类实例或成员)可能会但不可能具有与主对象相同的地址。对象的子对象不能共享地址,因此至多有一个子对象可能具有与主对象相同的地址 - 除了empty base optimization的情况外。

0

this是一个指向调用成员函数的对象的指针。

this的类型取决于成员函数。

例如,对于class X,如果成员函数是

1)常量,然后this是类型的const X*

2)挥发,然后thisvolatile X*

否则是