什么是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指针在调用之前生成,至于“类实例后函数”,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。
至于是否所有的this指针均按照寄存器传递,答案是不是的。与调用约定有关,this_call只能在里面限制类的成员函数。
__thiscall调用约定
a、__thiscall只能够用在类的成员函数上。
a、参数从右向左压栈。
b、如果参数个数确定,this指针通过ecx传递给被调用者;如果参数不确定,this指针在所有参数被压栈后压入堆栈。
c、对参数个数不定的,调用者清理堆栈,否则函数自己
清理堆栈