之前我们讲过编译器会对 nonmember functions 进行怎样的扩充和该写,今天我们来讲一下 member functions 函数调用方式

一、Nonstatic Member Functions(非静态成员函数)

  C++的设计准则之一就是:nonstatic member function 至少必须和 nonmember function 有相同的效率。也就是说如果们要在以下两个函数之间选择:

    float member_fun( const classA *_this){...};

    float classA::member_fun() const{...};

  那么选择 member function 不应该带来什么额外负担,因为编译器内部已经将“member 函数实体”转换为对等的“nonmember函数实体”,假设 member_fun()函数是这样:

  float member_fun( const classA *_this){ return sqrt(_this->x*_this->x+_this->y*_this->y+_this->z*_this->z);} ,咋看这个函数大家可能觉得没什么效率,因为它不能直接对 class 的成员进行操作。而 member functions 却可以。然而,member functions 要经过如下步骤转化为 nonmember function

  1.改写函数原型以安插一个额外的参数到 member function 中,用以提供一个存取管道,使class object 得意调用该函数,该额外参数被成为 this 指针。

  float classA::member_fun() const;被转化为 float ClassA::member_fun(const classA *const this);non-const member function 会转化为 float ClassA::member_fun(classA *const this);

  2.将每一个对 class nonstatic data member 的存取操作,改为经由 this 指针来存取:

    {

      return sqrt(

            this->x*this->x+

            this->y*this->y+

            this->z*this->z

            )

    }

  3.将 member function 重新写成一个外部函数,对函数名称进行 mangling 处理,使它在程序中成为独一无二的词汇。

     函数转化好以后,所有的调用操作都要转换:classa.member_fun(); 会被转化为(假设这里的member_fun 被 mangling 为 member_fun_classAFv) member_fun_classAFV( &classa );

  

  这样,一个 nonstatic member function 就被转化为 一个 member function 了,其他的函数体内优化都会类似于之前讲的普通函数优化相同了!

二、Virtual Member Function(虚拟成员函数)      

  我们知道如果一个 virtual member function 是通过 class object 调用是没有多态性的,会当做一般的 nonstatic member function 函数进行处理。只有通过指针或者引用才有多态性。那么多态如何实现呢?

    ptr->virtual_member_fun();

  会被内部转化为 (*ptr->vptr[1])( ptr );

  1. vptr 表示编译器产生的指针,指向 virtual table ,他被安插在每一个“声明有(或继承自)一个或多个 virtual function” 的 class object 中。事实上其名称会被 mangled,因为在一个复杂的 class 派生类体系中有可能存在有多个 vptrs。

  2.1 是 virtual table slot 的索引值。关联到 virtual_member_fun() 函数。

  3.第二个 ptr 是 this 指针---同一般的nonstatic member function。

三、Static member functions(静态成员函数)

  静态成员函数由于是独立于 class 的,在调用时不能再像以上两种函数那样安插一个 this 指针。这样,static member functiongs 就有了如下特性:

  1.它不能直接存取其 class 中的 nonstatic members。

  2.他不能够被声明为 const、volatile 或者 virtual。

  3.它不需要经由 class object 才被调用---虽然大部分时候他是这样被调用的!

  一个 static member function 会被提到 class 声明之外,并进行 mangled 处理,这样就可以与其他的静态成员变量区别开来(所有的静态成员都是放在一个静态内存内)。

Function语义学之member function的更多相关文章

  1. Thinkphp---------Call to a member function free_result() on a non-object

    1.平时用框架用久了,直接执行原生的sql反而做起来反应迟钝了.今天遇到一个问题,就是直接执行一个添加的sql语句,然后我用了TP框架的M()->query();方法.运行以后,会报Call t ...

  2. :( Call to a member function Table() on a non-object 错误位置

    :( Call to a member function Table() on a non-object 错误位置 $Model不是模板,是你自己先前链接数据库返回的对象...我的是改为$Form

  3. Fatal error: Call to a member function bind_param() on a non-object in

    今天在练习 mysql是出现错误:   Fatal error: Call to a member function bind_param() on a non-object in 解决步骤: 1. ...

  4. ECmall错误:Call to a member function get_users_count() on a non-object

    问题描述: 在后台添加了一个app报错:Call to a member function get_users_count()Fatal error: Call to a member functio ...

  5. magento后台 Fatal error: Call to a member function getId() on a non-object in错误

    后台分类管理出现错误 Fatal error: Call to a member function getId() on a non-object in 在数据库中运行以下sql语句 INSERT I ...

  6. Timer.4 - Using a member function as a handler

    In this tutorial we will see how to use a class member function as a callback handler. The program s ...

  7. C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化

    模板类模板成员函数(member function template)隐式处理(implicit)变化 本文地址: http://blog.csdn.net/caroline_wendy/articl ...

  8. About The Order of The Declarations And Definition When Making a Member Function a Friend.关于使类成员成为另一个类友元函数的声明顺序和定义。

    If only member function clear of WindowMgr is a friend of Screen, there are some points need to note ...

  9. About Why Inline Member Function Should Defined in The Header File

    About why inline member function should defined in the header file. It is legal to specify inline on ...

随机推荐

  1. QT 读写sqllite数据库

    QT 读写sqllite数据库 分类: 技术资料2014-04-10 10:39 84人阅读 评论(0) 收藏 举报 #include <QtGui/QApplication> #incl ...

  2. JAVA异常的捕获与抛出原则

    在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...

  3. NP-难题

    所谓NP-难题,在给定的一个信息系统中,假设研究对象书目为m,属性书目为n,则要考察的属性集P的一个子集是否为最小子集,要进行n*m*m次的比较.而n个属性可构成2的n次方个子集,这些子集都有可能是最 ...

  4. CentOS下的svn强制用户提交时写日志

    问题:在项目提交时候不写日志,在后期查看修改历史时需要对比版本才知道提交原因.解决方案:在svn服务端通过hooks在提交时强制要求写日志.#!/bin/shREPOS="$1"T ...

  5. 纯命令行教你Cocoapods的安装和使用

    关于cocoapods的介绍和作用,网上有很多大神介绍的比我清楚,建议去看一下唐巧的http://blog.devtang.com/blog/2014/05/25/use-cocoapod-to-ma ...

  6. 【POJ1568】【极大极小搜索+alpha-beta剪枝】Find the Winning Move

    Description 4x4 tic-tac-toe is played on a board with four rows (numbered 0 to 3 from top to bottom) ...

  7. 【Ural1057】幂和的数量

    [题目描述] 写一个程序来计算区间[X,Y]内满足如下条件的整数个数:它恰好等于K个互不相等的B的整数幂之和. 举个例子.令X=15,Y=20,K=2,B=2.在这个例子中,区间[15,20]内有3个 ...

  8. spring配置中引入properties

    <context:property-placeholder location="classpath*:db.properties" />

  9. spring mvc easyui tree 异步加载树

    使用spring mvc 注解 异步加载一棵树 jsp: <ul id="orgInfoTree"></ul> $(function(){ loadOrgT ...

  10. Flask 富文本编辑器

    XHEditor http://segmentfault.com/blog/digwtx/1190000002439076 CKeditor http://segmentfault.com/blog/ ...