C ++:理解“this”指针

时间:2016-02-04 17:59:34

标签: c++ pointers this

我想了解“this”指针。我认为“this”指针指的是类对象的值。 但是,在下面的代码中,我可以看到“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

了解这一点的任何帮助。

感谢。

2 个答案:

答案 0 :(得分:5)

  

我认为&#34;这&#34;指针指的是类对象的值。

正确。 this始终指向调用成员函数的对象。

  

我可以看到&#34;这个&#34;的不同价值。指针

哦,但是你没有打印thisglobalAglobalB)。您正在打印obj,它与this的类型不同。

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

答案 1 :(得分:0)

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

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

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

1)const,然后this的类型为const X*

2)易变,然后thisvolatile X*

否则为X*