this指针
this指针易混的几个问题:
(1)This指针本质是一个函数参数,只是编译器隐藏起形式的,语法层面上的参数。
this指针只能在成员函数中使用,全局函数、静态函数都不能使用this指针。
实际上,成员函数默认的第一个参数为T* const this
(2) this在成员函数的开始前构造,在成员的结束后消除。这个生命周期同任何函数的参数是一样的,没有任何区别。当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。
看起来 this指针和静态函数没差别,不过,区别还是有的。编译器通常会对this指针做一些优化,因此,this指针的传递效率比较高。
(3)this指针并不占用对象的空间
this相当于费静态成员函数的一个隐含的参数,不占用对象的空间。它跟对象之间没有包含关系,只是当前调用函数的对象被它指向自己。
所有成员函数的参数,不管是不是隐含的,都不会占用对象的空间,只会占用参数传递时的栈空间,或者直接占用一个寄存器。
(4)this指针是什么时候创建的?
this指针在成员函数的开始执行前构造,在成员的执行结束后消除。
但是如果class或者struct里面没有方法的话,它们是没有构造函数的,只是当做C的struct使用。采用TYPE xx的方式定义的话,在栈里分配内存,这时候this指针的值就是这块内存的地址。采用new方式创建对象的话,在栈里分配内存,new操作符通过eax返回分配的地址,然后设置给指针变量。之后去调用构造函数(如果有构造函数的话),这时将这块内存块的地址传给eax.
(5)this指针是如何传递给类中的函数的?绑定?还是在函数参数的首参数就是this指针?那么,this指针又是如何找到“类实例后函数”的?
大多数编译器通过eax寄存器传递this指针。事实上,这也是一个潜规则。一般来说,不同的编译器都会遵循一致的传参规则,否则不同的编译器产生的obj就无法匹配了。
(6)我们只有获得一个对象后,才能通过对象使用this指针。如果我们知道一个对象this指针的位置,可以直接使用吗?
this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们无法知道一个对象this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以通过&this获得)。