【1】Nonstatic Member Functions(非静态成员函数)

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

float magnitude3d(const Point3d* _this) {...};
float Point3d::magnitude3d() const {...};

那么选择member function不应该带来什么额外负担。这是因为编译内部已将“member 函数实体”转换为对等的“nonmember函数实体”。

下面就是转化步骤:

1、改写函数的signature以安插一个额外的参数到member function中,用以提供一个存取管道,是class object得以调用该函数。该额外参数被称为this指针;

2、将每一个“对nonstatic data member的存取操作”改为经由this指针来存取;

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

现在这个函数已经被转换好了,而其每一个调用操作也都必须转换。于是:

obj.magnitude();

变成了:

magnitude_7Point3dFv(&obj);

ptr->magnitude();

变成了:

magnitude_7Point3dFv(ptr);

【2】Static Member Functions(静态成员函数)

如果Point3d::normalize()是一个static member function,以下两个调用操作:

obj.normalize();

ptr->normalize();

将被转换为一般的nonmember函数调用,像这样:

normalize_7Point3dSFv();        //obj.normalize();
normalize_7Point3dSFv();        //ptr->normalize();

【3】Virtual Member Functions(虚拟成员函数)

如果normalize()是一个virtual member function,那么以下的调用:

ptr->normalize();

将会被内部转化为:

(*ptr->vptr[1])(ptr);

其中:

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

(2)1是virtual table slot的索引值,关联到normalize()函数。

(3)第二个ptr表示this指针。

转载于:https://www.cnblogs.com/dongerlei/p/5405252.html

C++ Member Functions的各种调用方式相关推荐

  1. 4.1 Member 的各种调用方式

    C++支持三种类型的member functions:static.nonstatic和virtual,每一种被调用的方式都是不同的.确定一个类成员函数不是为static:1.它能直接存取nonsta ...

  2. C++对象模型——Member的各种调用方式(第四章)

    第四章 Function语意学 (The Semantics of Function) 如果有一个Point3d的指针和对象: Point3d obj; Point3d *ptr = &obj ...

  3. 2021年大数据常用语言Scala(十二):基础语法学习 方法调用方式

    目录 方法调用方式 后缀调用法 中缀调用法 操作符即方法 花括号调用法 无括号调用法 方法调用方式 在scala中,有以下几种方法调用方式, 后缀调用法 中缀调用法 花括号调用法 无括号调用法 在后续 ...

  4. Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍(转)

    [-] 一普通同步方式 二事务方式Transactions 三管道Pipelining 四管道中调用事务 五分布式直连同步调用 六分布式直连异步调用 七分布式连接池同步调用 八分布式连接池异步调用 九 ...

  5. Winform开发框架的业务对象统一调用方式

    在这个纷繁的社会里面,统一性的特点能够带来很多高效的产出.牢固的记忆,这种特征无论对于企业.个人的开发工作,知识的传承都有着非常重要的作用,Winfrom框架本身就是基于这个理念而生,从统一的数据库设 ...

  6. Vue组件的三种调用方式

    最近在写fj-service-system的时候,遇到了一些问题.那就是我有些组件,比如Dialog.Message这样的组件,是引入三方组件库,比如element-ui这样的,还是自己实现一个?虽然 ...

  7. 提交响应后无法调用sendredirect_微服务的那些事(三),微服务的远程调用方式。RPC和HTTP...

    2.远程调用方式 无论是微服务还是SOA,都面临着服务间的远程调用.那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下几种: RPC:Remote Produce Call远程过程调用,类似 ...

  8. jS四种函数的调用方式

    6- js 函数的四种调用方式 2016年11月04日 13:41:54 阅读数:7559 函数的四种调用方式 函数有下列调用模式 函数调用模式 方法调用模式 构造器模式 上下文模式 函数调用 模式 ...

  9. vue 实例化几种方式_Vue组件的三种调用方式

    最近在写fj-service-system的时候,遇到了一些问题.那就是我有些组件,比如Dialog.Message这样的组件,是引入三方组件库,比如element-ui这样的,还是自己实现一个?虽然 ...

  10. Javascript中匿名函数的多种调用方式

    avascript中定义函数的方式有多种,函数直接量就是其中一种.如var fun = function(){},这里function如果不赋值给fun那么它就是一个匿名函数.好,看看匿名函数的如何被 ...

最新文章

  1. mysql 挂掉 无法启动_mysql-配置 - MySQL错误,时不时自动挂掉,无法启动
  2. redis源码之sds
  3. (三)HTTP再邂逅--熟悉HTTP协议结构和通讯原理
  4. LeetCode贪心 最长回文串
  5. 脑机互联不是梦,最新脑机接口发布:智能手机可操控!
  6. Debian 9 安装配置 Caddy Server
  7. qt 界面控件布局
  8. Java完全自学手册,从外包到大厂,再到年薪100万都靠它
  9. wpf linux 开发教程 pdf,深入浅出WPF
  10. 案例三:小明左右手分别拿两张纸牌:黑桃10和红心8,现在交换手中的牌。编写一个程序模拟这一个过程:两个整数分别保存在两个变量中,将这两个变量的值互换,并输出互换后的结果。...
  11. access()函数的用法
  12. 我的世界服务器水流动配置文件,我的世界后台的水流动命令是什么
  13. jQuery中的siblings()
  14. 6.1 Verbatim环境
  15. 2020安徽省大数据与人工智能网络赛题目
  16. POM文件配置的详解
  17. excel表格末尾添加一行_#天职经验谈# WORD表格技巧之 定位与公式
  18. 关于原创文章特此说明
  19. 基于SSM考试在线报名管理系统
  20. 二、Apollo高精地图详解(3.Apollo地图采集和生产)

热门文章

  1. synchronized的作用以及不足
  2. C# winfrom gridview全部选择和全部取消
  3. TX2系统备份与恢复
  4. ubuntu文件右下角有锁的图标
  5. CSS小技巧--文字对齐
  6. Cesium 1.51新功能评测
  7. 为何超四成人反感大数据应用
  8. python 反弹shell,加了UDP
  9. Lua参数绑定函数实现方法
  10. Python套接字编程(1)——socket模块与套接字编程