什么是 this 指针
struct Student
{
int a;
int b;
int c;
int d;
int Plus()
{
return a+b+c+d;
}
};
我把一个函数放到了结构体里面, 这种写法在 C++ 里面称为封装.
这么写有什么区别呢 ?
我们看汇编函数调用的地方, 明明我这里参数是空的, 但是看汇编这里编译器给我传参了, 而且传了一个指针, 这个指针就是当前结构体的地址.
这个就是现在要讲的 this 指针.
通常情况下, 编译器一般使用 ecx 来传递当前这个结构体的指针, 虽然你定义的时候函数参数是空的, 但是这个指针仍然存在. 这个指针就是 this 指针.
struct Student
{
int a;
int b;
int c;
int d;
void Plus()
{
return;
}
};
现在我们把这个函数改了, 什么参数都没有, 也不要什么返回值. 那么这个时候编译器还会给我传递结构体地址吗 ?
答案是会, 编译器仍然把这个结构体的地址传递给了我这个函数. 此时编译器仍然使用 ecx.
总结 : this 指针是编译器默认传入的, 通常都会使用 ecx 进行参数的传递.
既然默认都会传这个地址, 那么我在写代码的时候, 能不能在这个成员函数内部使用这个地址呢 ?
是可以的, 现在我们来看看如何使用 this 指针.
struct sclass
{
int a;
int b;
void Init(int a, int b)
{
this->a = a;
this->b = b;
}
void print()
{
printf("%d %d", a, b);
}
};
假设我在这个函数里面想使用这个 this 指针, 我就直接这样加上去就行了.
如果用的时候不这样加上去, 编译器就会混乱, 不知道这个变量是结构体本身的, 还是我们传递进去的, 从而导致赋值失败.
编译器不允许这个 this 指针进行运算, 也不允许对它进行重新赋值, 原因很简单, this 指针就代表当前结构体的地址, 你对它重新赋值加减运算也好, 那就没意义了.
总结 :
-
this 指针是编译器默认传入的, 通常都会使用 ecx 进行参数的传递.
-
成员函数都有 this 指针, 无论是否使用.
-
this 指针不能做加减等这种运算, 不能被重新赋值.
-
this 指针不占用结构体的宽度.