深度探索C++对象模型---Member Function的各种调用方式
来源:互联网 发布:纪录片推荐 知乎 编辑:程序博客网 时间:2024/06/07 07:47
Member的各种调用方式
Point3d obj;Point3d *ptr = &obj;obj.normalize();ptr->normalize();按函数为非静态成员函数,静态成员函数,virtual函数讨论
1 非静态成员函数:被编译器在内部转化为对等的非成员函数实例,调用并不会有什么额外负担,转化分下面3个步骤
(1)改写函数原型,以安插一个额外的参数到成员函数中,是为了使用类对象调用此函数,就是将函数的第一个参数设置为this指针。
(2)对每个非静态成员的存取操作,改为经由this指针的存取
(3)将成员函数重写成一个外部函数,函数名经过“mangling”处理,成为独一无二的词汇
将上面两个函数进行转换后的形式可能是下面:
normalize__7Point3dFv(&obj);normalize__7Point3dFv(ptr);ptr与obj都表示this指针。
2 静态成员函数:也将转化为一般的非成员函数调用。
静态成员函数的特性(无this指针):
(1)不能够直接存取类中的非静态成员
(2)不能被声明为const , volatile或virtual
(3)不需要经由class object才被调用,可以经过类名调用
所以如果是静态成员函数,可能如下:
normalize__7Point3dFv();normalize__7Point3dFv();
如果取一个静态成员函数的地址,获得的是其在内存中的位置,即真实地址你,且因为没有this指针,地址类型是一个非成员函数指针,而不是成员函数指针。
所以对于上面两中情况,函数调用会直接变为一个经过mangling处理的非成员函数调用,区别是非静态成员将添加一个this参数,而静态成员的不填加新的参数。
3 虚成员函数
通过类对象的指针调用的情况,可能被转化为下面的情况
(*ptr->vptr[1])(ptr)vptr是由编译器产生的指向虚函数表的指针,安插在每一个有虚函数,或继承了虚函数的类的对象中,事实上也会被mangled。
1 表示virtual table slot的索引值,关联到normalize函数
第2个ptr表示this指针。
如果normalize函数中又调用了一个同一个类中的虚函数virtual float Point3d::magnitude(),则因为已经对normilize由虚拟机制决议妥当,所以这个虚函数可以被显示调用,Point3d::magnitude,而且这个决议方式会和上面两种一样,被转换成一个非静态成员的方式,可以压制虚拟机制,提高效率。
virtual float Point3d::magnitude();float mag = magnitude__7dPoint3dFv(this);如上,magnitude()表示同一个类中的虚函数normalize中调用的函数,前提是显示通过类名调用,则会被转换成非成员函数,提高效率。
- 深度探索C++对象模型---Member Function的各种调用方式
- 深度探索C++对象模型---Function语义学之Member的各种调用方式
- 【C++】深度探索C++对象模型之虚拟成员函数(virtual member function)
- 4.1 Member Function的各种调用方式
- 深度探索c++对象模型之member function的具现行为
- 深度探索C++对象模型------Data member的绑定
- 深度探索C++对象模型----data member的存取
- 《深度探索C++对象模型》:Data member的布局
- 《深度探索C++对象模型》:member functions
- Function 语意学之Member 的各种调用方式
- Function语意学 Member的各种调用方式
- Member Function的调用方式
- C++对象模型——Member的各种调用方式(第四章)
- 【C++】深度探索C++对象模型之Function语意学
- 深度探索C++对象模型---Data member的布局(Data member Layout)
- 深度探索C++对象模型--继承与Data Member
- 深度探索C++对象模型——Data Member的布局(2)书上的错误
- 深度探索C++对象模型-----带有Default Constructor的member class object
- Qt通过QNetworkAccessManager实现Http get方法文件下载
- 代码点与代码单元
- spark standalone 安装(手动启动)
- JDBC编程理论知识(1)
- poj1990(树状数组好题)
- 深度探索C++对象模型---Member Function的各种调用方式
- ant实现java项目的自动构建和部署
- Android内存泄露方案管理
- 搜* 索*引*擎
- C++设计模式之原型模式(三)
- 确保对象的唯一性——单例模式
- Servlet实现网络IP过滤
- 【网络编程】UDP/TCP 数据包的大小限制
- OC之 NSMutableString, NSNumber, NSMutableNumber, NSArray