C++中的this
#include<stdio.h>
struct A {
int Sum(int x, int y) {
return x+y;
}
};
int main()
{
A a;
printf("%p\n",a);//输出000000CC
printf("%p\n",&a);//输出栈空间中那个1字节的地址,
printf("%d\n", sizeof(a));//输出1
printf("%d\n", a.Sum(3, 4));
return 0;
}
上面,我并没有定义一个类,而是采用了结构体的方式,在结构体里面定义一个函数,按道理来说结构体或类中没有成员变量,只有成员函数,其sizeof应该是0,但是这里编译器针对这种情况,在栈中给了1字节的空间给结构体,里面存放的值是0XCC。
好了,聚焦到this上面,我们看看反汇编。
从上面反汇编看出,在调用a.Sum(3,4)的时候,两个push之后,又有一个lea ecx,[ebp-9],即通过寄存器ecx将参数传递给Sum,并且ecx值为ebp-9,就是上面说的0xCC的地址,即结构体的首地址。因此this指针的内容就是结构体的首地址。
我们在学习的时候,老师会说this就是代表你创建的对象本身,从反汇编角度this就是对象的首地址。
#include<stdio.h>
class A {
private:
int x;
int y;
public:
A(int x,int y) {
this->x = x;
this->y = y;
}
};
int main()
{
A a(2,3);
return 0;
}
上面的代码在构造函数里面用了this,同样的也是在把对象的首地址当做this,也可以看出构造函数调用前其实编译器已经创建了对象,只不过没有对成员变量赋值而已,但是存储空间已经给了。
总结
this的用法还是比较灵活的,这里说的也不全面,希望共同进步