2_this 指针

什么是 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 指针就代表当前结构体的地址, 你对它重新赋值加减运算也好, 那就没意义了.

总结 :

  1. this 指针是编译器默认传入的, 通常都会使用 ecx 进行参数的传递.

  2. 成员函数都有 this 指针, 无论是否使用.

  3. this 指针不能做加减等这种运算, 不能被重新赋值.

  4. this 指针不占用结构体的宽度.