深度探索C++对象模型——学习笔记3

第四章 function语意学

members的各种调用方式
非静态成员函数
成员函数被内化为非成员函数的形式
1.改写函数的原型,安插一个参数this指针到函数中
2.将每一个对非静态数据成员存取操作改为经过this指针来存取
3.将成员函数重新写成一个外部函数,将函数的名称经过“mangling”处理,它在程序中成为独一无二的词汇

虚成员函数
ptr->normalize();
内部转化:
(*ptr->vptr[1])(ptr);
从虚函数表中的slot找到normalize()函数, ptr表示this指针

静态成员函数
转化为一般的非成员函数
normalize_7point3d();
静态成员函数的提出由于其不靠class object,然后提倡设定静态数据成员为unpublic,那么就要提供成员函数存取这个成员。没有必要通过成员函数进行存取。设计者希望支持没有class object存在,方法就是把0强制转化为class指针
((Point3d*)0)->object_count();
后来提出了静态成员函数

其特性:
不能直接存取class中的非静态成员
不能被声明为const,virtual,volatile
不需要经过class object调用

4.2虚成员函数
欲鉴定那些类展现了多态特性,需要额外的执行期信息。
这些信息可以是:一个数字或者字符串表示类的类型。一个指针指向某个表格,表格中有虚函数的执行期的地址
找到函数地址的步骤:

  • 一个类对象中被安插了一个由编译器内部产生的指针,指向这个表格
  • 为了找到函数地址,每一个虚函数被指派一个表格索引值

每个虚函数在虚函数表中都被指派一个固定的索引值,这个索引在整个继承体系中保持与特定的虚函数的关系

多重继承下的虚函数
thunk技术:以适当的偏移量调整this指针,跳到虚函数去。这个技术允许虚函数表槽继续内含一个简单的指针
一个类拥有多个虚函数表
这里写图片描述

虚继承下的虚函数

这里写图片描述

4.3函数的效能
非成员函数,静态成员函数,非静态成员函数具有相同的效率,是由于他们最终被转化相同的形式

4.4指向成员函数的指针
去非静态成员函数地址,得到的是内存中的地址,然而这个值也是不完全的。它需要绑定在某个类对象的地址上,才能够通过它调用这个函数。

支持指向虚成员函数的指针
取虚函数地址时,得到的是在虚函数表中索引值
当虚函数出现,会使得成员函数指针复杂化。因为成员函数指针有两种意义,代表内存地址和代表虚表中的索引值。

在多重继承下,指向成员函数的指针
对指向成员函数指针设计了一个结构体

指向成员函数的指针的效率
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值