一.this指针的主要用途:
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也即,即使没写this指针,编译器在编译的时候也会加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。
二.this指针的使用
情况1.在类的非静态成员函数中返回类对象本身的时候,直接使用return *this
情况2.当参数与成员变量名相同时使用this指针,eg: this->n=n;(不能写成n=n)。
三.一个类中所有对象调用的成员函数都是同一代码段。那么,成员函数是怎样识别成员数据是属于哪个对象的呢?
原来,在对象调用时,成员函数除了接受实参外,还接受到了一个对象的地址,这个地址被一个隐含的形参this指针获取,它等同于执行this = &对象名,所有对数据成员的访问都隐含地被加上前缀this->。
四、Question:
- this指针什么时候创建?
this在成员函数的开始执行前构造,在成员的执行结束后清除。
但是如果class或者struct里面没有方法的话,它们是没有构造函数的,只能当做C的struct使用。采用 TYPE xx的方式定义的话,在栈里分配内存,这时候this指针的值就是这块内存的地址。采用new的方式 创建对象的话,在堆里分配内存,new操作符通过eax返回分配 的地址,然后设置给指针变量。之后去调 用构造函数(如果有构造函数的话),这时将这个内存块的地址传给ecx. - this指针存放在何处?堆,栈,全局变量,还是其他?
由上一问可知,this指针无需显式存储在内存中,只要存储对象的内存位置确定,对应的this指针就被确定了。 - this指针如何传递给类中函数的?绑定?还是在函数参数的首参数就是this指针。那么this指针又是如何找到类实例后的函数的?
This是通过函数参数的首参数来传递的,this指针是在调用之前生成的。大多数编译器通过ecx寄存器传递this指针。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从来的函数定义完成后,它就在那里 - 我们只有获得一个对象后,才能通过对象使用this指针,如果我们知道一个对象this指针的位置可以直接使用么?
This指针只有在非静态成员中才有意义,获得一个对象后,不需要在类外部使用this对其操作。应当注意this是一个右值,不存在所谓的this的位置,只是this表示了对象的存储位置而已。&this违反语义规则,编译无法通过。 - 每个类编译后,是否创建一个类中函数表来保存函数指针,以便来调用函数?
一般来说,对于类成员函数(不论是静态还是非静态的成员函数)都不需要创建一个在运行时的函数表来保存,只有虚函数才会被放到函数表中。但是,即使是虚函数,如果编译器能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用,而是可以直接调用该函数