C++ this指针详解
this指针:
每个成员函数都有一个隐含的输入参数this指针,this指向当前对象,this指针可以用来访问对象的数据成员。
class B {public: void fun1() { } void fun() const{ printf("成员函数地址:%x\n", &B::fun1); printf("成员数据x的地址:%x\n", &x); printf("成员数据y的地址:%x\n", &y); printf("当前对象地址:%x\n", this); printf("当前对象的this指针类型:%s\n", typeid(this).name()); printf("\n"); } int x; int y; };int main() { B b1, b2; const B b3; b1.fun(); b2.fun(); b3.fun(); }
结果:
成员函数地址:f8114f 成员数据x的地址:cffd94 成员数据y的地址:cffd98 当前对象地址:cffd94 当前对象的this指针类型:class B const * 成员函数地址:f8114f 成员数据x的地址:cffd84 成员数据y的地址:cffd88 当前对象地址:cffd84 当前对象的this指针类型:class B const * 成员函数地址:f8114f 成员数据x的地址:cffd74 成员数据y的地址:cffd78 当前对象地址:cffd74 当前对象的this指针类型:class B const *
结论:成员函数是属于类的,成员数据是属于对象的。
程序修改成:
class B {public: void fun1() { } void fun() const{ printf("成员函数地址:%x\n", &B::fun1); printf("成员数据x的地址:%x\n", &x); printf("成员数据y的地址:%x\n", &y); printf("当前对象地址:%x\n", this); printf("当前对象的this指针类型:%s\n", typeid(this).name()); printf("\n"); } void fun() { printf("成员函数地址:%x\n", &B::fun1); printf("成员数据x的地址:%x\n", &x); printf("成员数据y的地址:%x\n", &y); printf("当前对象地址:%x\n", this); printf("当前对象的this指针类型:%s\n", typeid(this).name()); printf("\n"); } int x; int y; };int main() { B b1, b2; const B b3; b1.fun(); b2.fun(); b3.fun(); }
结果:
成员函数地址:931ac8 成员数据x的地址:12ffbb4 成员数据y的地址:12ffbb8 当前对象地址:12ffbb4 当前对象的this指针类型:class B * 成员函数地址:931ac8 成员数据x的地址:12ffba4 成员数据y的地址:12ffba8 当前对象地址:12ffba4 当前对象的this指针类型:class B * 成员函数地址:931ac8 成员数据x的地址:12ffb94 成员数据y的地址:12ffb98 当前对象地址:12ffb94 当前对象的this指针类型:class B const *
结论:当前this指针的类型不仅与对象(const or not)有关,还与对象所调用的成员函数有关。
那么,为什么可以用this指针访问成员函数呢?
class B {public: void fun1() { printf("fun1()\n"); } void fun2() { this->fun1(); } };
猜测:每个对象都需要访问成员函数,那么,该对象里一定复制了类的成员函数(应该放在内存的程序段)的地址;既然对象与类有关,那么对象里除了数据成员之外,肯还有其他与类相关的信息。
还有一种可能是,类的成员函数在编译时都修饰成类名有关的名称,这个名称变成了全局唯一的函数名,这些函数都应该放在内存的代码段位置;当对象访问成员函数时,将直接使用修饰过后的名称来调用;而非类的对象调用类的成员函数时,无法使用修饰过的函数名,所以访问出错。这样看来,通过this指针访问成员函数,与直接访问成员函数没有区别,或者说this指针与成员函数没有关系。之所以允许这种写法,是为了让人看上去更直观一些。
static成员函数与this指针:
static成员函数没有默认将this指针参数,所以static成员无法访问对象的数据,只能访问static数据成员。
为什么说this指针不是对象的一部分?this指针所占用的内存不会反应在sizeof的结果中?
this指针是动态构造的,只有在调用非静态成员函数时,才临时构造并传入到成员函数的形参中,调用完毕则被销毁(与形参的属性一致),猜测这就是平时并不占用对象的内存的原因。
虚函数中的this指针:
在虚函数所在类中,有一张虚函数表,而类的对象则有一个虚表指针,指向这张虚表。当虚函数被子类的函数覆盖(重写)时,虚函数表中的相应位置的函数指针将被替换成子类的函数指针。this指针相当于虚表指针?