zoukankan      html  css  js  c++  java
  • static 和 no static Member function学习

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

    #include <iostream>
    
    using namespace std;
    
    
    
    typedef void (*p)();
    
    
    class Object
    {
    public:
        static void s_fun_1() { cout << "static function 1
    "; }
    
        void fun_1() {cout << "no static function 1
    ";}
    };
    
    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。那么就能够这样:


    这当然也是能够执行的。



  • 相关阅读:
    启用 Win10 的 Linux 子系统
    破解 RHEL7.3 的 root 密码
    实战:tcpdump抓包分析三次握手四次挥手
    grep中的正则表达式
    快速配置yum本地源
    Kubernetes 集群搭建(下)
    从事游戏行业也有10年,让我来说下游戏的本质,为什么上瘾。
    Egret 生成 自带EUI 的微信小游戏 踩坑!
    JMeter入门
    像屎一样的 Spring Boot入门,总算有反应了
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7351426.html
Copyright © 2011-2022 走看看