static 和 no static Member function学习
来源:互联网 发布:linux alias ll 编辑:程序博客网 时间:2024/05/21 14:00
下面是做实验的一段代码:
#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,那么就可以这样:
这当然也是可以运行的。
0 0
- static 和 no static Member function学习
- static member variable and static member function in a class
- c++学习-reference to non-static member function must be called
- 浅出理解静态成员函数(static member function)
- "Cannot declare member function ...to have static linkage"错误
- invalid+use+of+non-static+member+function+问题
- 浅出理解静态成员函数(static member function)
- 出现错误"illegal call of non-static member function"?
- "Cannot declare member function ...to have static linkage"错误
- 【c++】cannot declare member function *** to have static linkage [-fpermissive]
- error"Cannot declare member function ...to have static linkage"
- "Cannot declare member function ...to have static linkage"错误
- Cannot declare member function ...to have static linkage"问题
- "Cannot declare member function ...to have static linkage"错误
- C++ error:static member function cannot have cv-qualifier
- reference to non-static member function must be called
- Cannot declare member function ‘static int Foo::bar()’ to have static linkage
- static成员"Cannot declare member function ...to have static linkage"错误
- 2014年开发者需要了解的10大开发趋势和技能
- WinForm中,实现TextBox的验证
- Log4Net使用指南
- Actioncontext和ServletActioncontext的区别
- hdu 3681 Prison Break 扫描线set
- static 和 no static Member function学习
- C# manifest文件介绍
- Winsocke简述、取网页原理概述
- dba 常用管理脚本收集(测)
- POJ1163 The Triangle 【DP】
- 极度恐惧阿斯科利大家看啦时间的
- atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表
- 会场安排问题--分好情况后,怎么考虑让更少的情况发生
- SimpleAdapter.ViewBinder方法说明