打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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指针相当于虚表指针?

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
C语言 const 修饰函数参数 - C语言零基础入门教程
C++经典面试题
C++语言学习笔记(一)
C++空类中的默认函数
m_hWnd
「博文连载」C 中的“指针”
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服