成员函数、虚函数、this指针

来源:互联网 发布:武汉大数据培训班 编辑:程序博客网 时间:2024/06/10 19:48

1、成员函数的实现机制和普通(全局)函数没有本质区别,对编译器而言,经过名称处理以后(在函数名前加上命名空间、类名),一个成员函数就是普通函数了,在编译后的代码区域有确定的函数体和入口地址。最大的差别在于发生调用时,对于成员函数,编译器会隐含语句push this,其中this指针指向对象的地址,这就是操作所需要的数据的所在。编译后的成员函数调用可能是:
...
push this
call f
...
因此,在对类使用sizeof时,是无法看到成员函数占用空间的,因为其入口地址仅仅是在函数调用时由编译器确定,而类存储空间中无需记录任何有关成员函数的信息

2、而静态成员函数实际上就是普通函数,只不过编译器限制了它的名字可视范围而已(因为在编译时在函数名前加上了类名)。因此调用静态成员函数时不需要push this指针的,只需要在函数名字前加上类名限定符就可以了。

3、根据以上内容可以更好理解虚函数动态绑定。当一个类中定义了虚函数,编译器会为该类定义一个虚表,该虚表记录着所有虚函数的入口地址。与此同时,类的数据成员中会被插入一个虚指针指向这个虚表设置v-ptr必须发生在对基类构造函数的调用之后。因为,继承类如果有自己的虚函数表,那么v-ptr会被改写,以指向该表,即使此前v-ptr已经被基类所设置)。这就是为何定义成员函数不会改变sizeof(Class)的大小,而定义一个或多个虚函数均会使sizeof(Class)的大小增加4(虚指针的存储空间)。而在调用虚函数时,使用跟调用成员函数相同的策略,先push this,再根据this指向对象取得虚表中相应虚函数的入口地址,通过这样实现动态绑定,而不会像成员函数一样在编译时确定其入口地址。


原创粉丝点击