码迷,mamicode.com
首页 > 其他好文 > 详细

static 和 no static Member function学习

时间:2014-07-19 11:21:04      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:static member functi

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

#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,因为其是类方法,不会使用到数据成员,不需要绑定到特定的对象。

上面的运行结果:

bubuko.com,布布扣

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

bubuko.com,布布扣

但是其实,从上面可知,我们的fun_1没有使用到Member data,那么就可以这样:

bubuko.com,布布扣

这当然也是可以运行的。

bubuko.com,布布扣


static 和 no static Member function学习

标签:static member functi

原文地址:http://blog.csdn.net/zhx6044/article/details/37954875

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!