以下是做实验的一段代码:

#include <iostream>

using namespace std;

typedef void (*p)();

class Object
{
public:
static void s_fun_1() { cout << "static function 1\n"; } void fun_1() {cout << "no static function 1\n";}
}; typedef void (Object::*p1)(); void do_fun(p p_) {(*p_)();} int main()
{
do_fun(Object::s_fun_1); Object obj; p1 p1_ = &Object::fun_1; (obj.*p1_)();
return 0;
}

在C++中,各个编译器的实现可能不一样,可是对于no static Member function的处理还是有迹可循的。对于no static Member function的处理一般有下面几个步骤:

1.改写函数的函数原型(signature),以为函数安插一个额外的參数,作为存取对象数据成员的一个通道,这个过程也就将Member变为了no Member,这个參数就是this指针。

比如 void Object::fun()转化为void Object::fun(Object * const this);在成员函数中this指针是不可赋值的体如今这边。

假设是 void Object::fun()则转化为void Object::fun(const Object * const this);

2.对数据成员的使用通过提供的通道也就this指针完毕。

3.对函数名进行mangling,使它变为程序中唯一的词汇。

对于NRV的实施也是在这个过程中,其在第一步提供了訪问通道同一时候为返回值提供了返回通道。

而对于static Member function的处理。没有涉及到Class Object,由于其是类方法,不会使用到数据成员,不须要绑定到特定的对象。

上面的执行结果:

能够看出对static Member function的处理,其的地址是一个普通的函数指针。我们能够将它做个callback来使用。而对于nostatic Member function的须要详细关系到class,调用时须要也就关联到详细的class Object。例如以下:

可是事实上。从上面可知,我们的fun_1没有使用到Member data。那么就能够这样:

这当然也是能够执行的。

最新文章

  1. 记、基于react-router的单页应用
  2. C++Primer 第六章
  3. ubuntu12.04下txt文件乱码如何解决
  4. 【转】Please define the NDK_PROJECT_PATH variable to point to it
  5. Spark学习笔记--Transformation 和 action
  6. centos7 install rvm
  7. 解决行内元素间隙bug问题
  8. ECMAScript 6 笔记(一)
  9. HDU - 4545 字符串处理
  10. Hbuilder之开发Python
  11. 1068: [SCOI2007]压缩
  12. sql server 查询log日志 sql语句
  13. Win10解除网速限制让网速飞起来
  14. Windows FFMPEG开发环境配置
  15. 使用element-ui 遇到的问题
  16. Javascript 高级程序设计(第3版) - 第02章
  17. MySQL服务器最大连接数的合理设置
  18. 混沌分形之马丁(Martin)迭代
  19. 使用 urllib 设置代理服务
  20. nginx socket转发设置

热门文章

  1. JSON在PHP中的基本应用
  2. patch 用法
  3. AWR--service statistics
  4. 拆解探索MagSafe电源接口结构和指示灯变颜色原理
  5. CHM编写软件
  6. Oracle中索引的使用 索引性能优化调整
  7. 26个Jquery1.4使用小技巧
  8. ubuntu上minigui调试环境的建立
  9. 似然和对数似然Likelihood &amp; LogLikelihood
  10. cubieboard 通过VGA点亮电脑屏幕笔记