Member Function的调用方式
来源:互联网 发布:脸型测试软件免费下载 编辑:程序博客网 时间:2024/06/04 05:30
一,member function的调用方式
C++支持三种类型的member function:static、nonstatic和virtual,每一种类型被调用的方式都不同。
二,Nonstatic Member Function
C++的设计准则之一就是:nonstatic member function至少必须和一般的nonmember function有相同的效率。选择member function不应该带来什么额外的负担,这是因为编译器已将member函数实例转换为对等的nonmember函数实例,实际上member function被内化为nonmember的形式,下面就是转化的步骤:
1,改写函数的函数原型,以安插一个额外的参数到member function中,这个额外的参数被称为this指针。
2,将每一个对nonstatic data member的存取操作改为经由this指针来存取。
3,将member function重写成一个外部函数,函数名称经过"mangling"处理,使它在程序中成为独一无二的词汇。
三,Static Member Function
static member function的主要特征是它没有this指针,以下的次要特征都是根源于其主要特征。
1,不能够直接存储nonstatic members。
2,不能被声明为const、virtual。
3,它不需要经由class object才被调用,虽然大部分时候它是这样被调用的。
4,对static member function的调用会转换为一个直接调用操作
class Point{public: static int object_count(){ return 10; }};int main(){ Point obj; Point *pObj = &obj; obj.object_count(); pObject->object_count(); //上面两个对static member function的调用会转换下面这个直接调用操作 //Point::object_count() return 0;}
四,Virtual Member Function
如果normalize()是一个virtual member function,那么以下的调用:
ptr->normalize();
将会被内部转换为:
(*ptr->vptr[1])(ptr);
vptr表示由编译器产生的指针,指向virtual table。1 是virtual table slot的索引值,关联到normalize()函数。第二个ptr表示this指针。
五,多态
在C++中,多态表示"以一个public base class的指针(或引用),寻址出一个derived class object的意思"。
1,当一个类中声明有虚函数会发生什么事情?
(1),编译器会给这个类创建一个虚函数表,表中存放的是虚函数的地址。每一个虚函数都被指定一个固定的索引值,这个索引在整个继承体系中保持与特定的虚函数的关系。
(2),会给每个class object增加一个成员vptr,指向class所拥有的虚函数表。
2,当一个class派生自Point会发生什么什么事情?
(1),它可以继承base class所声明的virtual function实例。正确地说,该函数实例的地址被拷贝到derived class的virtual table的相应slot中。
(2),对base中的虚函数进行覆盖,这表示它自己的虚函数实例必须放在对应的slot中。
(3),加入新的virtual function。
3,如何确保调用到正确的虚函数?
假设有下面这个虚函数调用
ptr->normalize();
我们如何有足够的知识在运行时,调用正确的normalize()函数?
(1),在调用normalize()时,经由ptr可以获取该对象的virtual table。
(2),虽然我们不知道哪一个normalize()函数实例会被调用,但是我们知道每一个normalize()函数地址都被放在slot 1中。
(3),根据上面这些信息,编译器可将上面的调用转换为:
(*ptr->vptr[1])(ptr);
- Member Function的调用方式
- 4.1 Member Function的各种调用方式
- Function 语意学之Member 的各种调用方式
- Function语意学 Member的各种调用方式
- 深度探索C++对象模型---Member Function的各种调用方式
- 深度探索C++对象模型---Function语义学之Member的各种调用方式
- 指向Member Function 的指针
- 指向 Data Member / Member Function 的指针的类型
- js 调用 function 的多种方式
- member function 对object size的影响
- const的object和 const member function
- C++对象模型——Member的各种调用方式(第四章)
- js function 的5种不同调用方式
- function module的增强(非一般调用方式)。
- Java调用oracle function的两种方式
- Java调用oracle function的两种方式
- Function语义学之member function
- const member function不明白
- [LeetCode
- metasploit魔鬼训练营第一章实践作业
- Error:Execution failed for task ':app:mergeDebugResources'. > Error: java.ut
- oracle 的sys 和 system 账号
- 栈的压入、弹出序列
- Member Function的调用方式
- BZOJ4864 [BeiJing 2017 Wc]神秘物质
- JavaWeb--Servlet过滤器Filter和SpringMVC的HandlerInterceptor(Session和Cookie登录认证)
- SuperMap Objects .NET 中更新方法的使用
- C++的扩充
- MySql查询IF和CASE条件判断使用
- 单页面网站如何做seo关键词优化
- 第一个博客(文章标题在这里)
- DOM 优化