谈一谈this指针

什么是this指针?

1.一个经典的例子

当你进入一个房子,你可以看到房子里的桌子、沙发、地板,但是你看不到房子的全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但类实例的本身呢,这里就出现了this指针,始终指向该类的实例。

在这个例子中,类就好比是一座房子,而this就好比是这座房子的钥匙,一旦有了钥匙,就可以对房子里的物品进行使用了。

this是指向实例化对象本身的一个指针,里面存储的是对象本身的地址,通过该地址可以访问类内部的成员函数和成员变量。

2.this指针的使用场景

举个最简单的例子,当我们在类中定义了一个变量,并且在类成员函数中也定义了这个变量,那么就会存在命名冲突,如何区别我们要进行操作的变量呢?这时,this指针就起到了作用。

3.this指针的作用

一个类对象的this指针不是类对象的一部分,不影响sizeof的结果。
this作用域是在类的内部,自己声明的一个类时,我们还不知道实例化对象的名字,所以用this来使用对象变量的本身。在非静态成员函数中,编译器在编译的时候加上this指针作为隐含参数,通过this来访问各个成员。

4.this的使用

(1) 在类的非静态成员函数中返回对象本身
常用于运算符的重载、拷贝。

return *this;

(2)参数和成员变量名相同

this->n=n;

5.this指针的特点

(1)只能在类的成员函数中使用,全局函数和静态函数均不能使用this指针;
(2)this在成员函数开始前构造,在成员函数结束时消除。
当调用一个成员函数时,编译器将类的指针作为this指针传进去。

A a;
a.fun(10);
//编译器最后做的处理如下
A::fun(&a, 10);

6.this指针为什么不能在静态成员中使用?

因为静态函数和静态变量不属于哪一个具体的对象,是全局意义上的,但this是实际上存在的一个对象,是具体的,所以,this指针不能再静态成员中使用。

7.this指针是如何传递的?是否所有的this指针均按照寄存器传递?

大多数的编译器是通过ecx寄存器传递this指针,也是一个大家都默认遵循的规则,不同的编译器会遵循一致的传参规则,否则不同编译器产生的obj文件就无法匹配。

在call之前,编译器会把对应的对象地址放到eax中。this是通过函数参数的首参来传递的(参数压栈)。this指针在调用之前生成,至于“类实例后函数”,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。

扫描二维码关注公众号,回复: 2308492 查看本文章

至于是否所有的this指针均按照寄存器传递,答案是不是的。与调用约定有关,this_call只能在里面限制类的成员函数。

__thiscall调用约定

a、__thiscall只能够用在类的成员函数上。
a、参数从右向左压栈。
b、如果参数个数确定,this指针通过ecx传递给被调用者;如果参数不确定,this指针在所有参数被压栈后压入堆栈。
c、对参数个数不定的,调用者清理堆栈,否则函数自己
清理堆栈

猜你喜欢

转载自blog.csdn.net/zwe7616175/article/details/81099452