我想了解“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
了解这一点的任何帮助。
感谢。
答案 0 :(得分:5)
我认为&#34;这&#34;指针指的是类对象的值。
正确。 this
始终指向调用成员函数的对象。
我可以看到&#34;这个&#34;的不同价值。指针
哦,但是你没有打印this
(globalA
和globalB
)。您正在打印obj
,它与this
的类型不同。
this
的类型为concrete*
。当您将其传递给采用类型InterfaceB*
的参数的函数时,指针隐式converted到另一种类型。允许转换,因为interfaceB
是concrete
的基础。转换后的指针将不再指向this
对象,而是指向基类子对象。子对象(基类实例或成员)可能但可能与主对象的地址不同。对象的子对象不能共享地址,因此最多一个子对象可以与主对象具有相同的地址 - 除了empty base optimization的情况。
答案 1 :(得分:0)
this
是一个指针,它引用调用成员函数的对象。
this
的类型取决于成员函数。
例如对于class X
,如果成员函数是
1)const,然后this
的类型为const X*
2)易变,然后this
为volatile X*
否则为X*