首页 > 编程语言 > 详细

C++ this指针详解

时间:2019-03-17 17:26:56      阅读:171      评论:0      收藏:0      [点我收藏+]
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指针相当于虚表指针?

 

C++ this指针详解

原文:https://www.cnblogs.com/bi-an/p/10547765.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!