Function语义学之member function
之前我们讲过编译器会对 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的更多相关文章
- Thinkphp---------Call to a member function free_result() on a non-object
1.平时用框架用久了,直接执行原生的sql反而做起来反应迟钝了.今天遇到一个问题,就是直接执行一个添加的sql语句,然后我用了TP框架的M()->query();方法.运行以后,会报Call t ...
- :( Call to a member function Table() on a non-object 错误位置
:( Call to a member function Table() on a non-object 错误位置 $Model不是模板,是你自己先前链接数据库返回的对象...我的是改为$Form
- 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. ...
- 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 ...
- 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 ...
- 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 ...
- C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化
模板类模板成员函数(member function template)隐式处理(implicit)变化 本文地址: http://blog.csdn.net/caroline_wendy/articl ...
- 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 ...
- 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 ...
随机推荐
- java解析xml文件四种方式
1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找 ...
- Difference Between XML and XAML.
XML, or Extensible Markup Language, is a subset of the more complex SGML (Standard Generalized Mark ...
- Oracle利用dbms_metadata.get_ddl查看DDL语句
当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metadata.get_ddl这个包来查看. dbms_metadata包中的get_ddl函数详细参数 GET_DDL函数返回创建 ...
- treeview右键添加新节点
private void advTree1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Righ ...
- MySQL性能测试工具之mysqlslap使用详解
mysqlslap是mysql自带的基准测试工具,优点:查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较.msq ...
- Linux通配符
* 任意字符 ?任意单个字符 [] 匹配指定 字符范围内的字符 [^] 指定范围之外的单个字符 常规字符集合 [a-z] a到z的所有小写字母 [A-Z] a到z的所有大写字母 [0-9] 0到9的所 ...
- java基础学习总结01
在过去的一周我们先学习了JAVA的一些基础知识和基础语法,基础知识包括:指令.程序.计算机语言.机器语言.高级语言的概念和特点,java的概念.平台.组建等,以及代码的编译过程,代码的开发流程.基础语 ...
- Centos7搭建php+mysql环境(整理篇)
终于将mysql+php环境搭建成功,将之前的整理一下,环境:centos7,本机IP:192.168.1.24,数据库用户名及密码都设为root,测试文件路径:/var/www/html 1.取消c ...
- 一起来背ABC
construction 构造,结构 constructor 构造函数,施工员
- JQuery 点击控件获取当前坐标时不兼容IE7
现在要求在点击文本框时,获取文本框的坐标,需要相对文本框的位置来显示信息. 思路就是,绑定文本框的click 事件,一旦有点击就触发,去调用clickevent 函数执行计算. $('#txt_m') ...