zoukankan      html  css  js  c++  java
  • 静态成员函数访问构造函数

    在C++中,静态成员函数只能访问静态成员,原因在于没有this指针。这已经是常识了。

    其实,成员函数在编译时,编译器会自动加上this指针。

    比如

    A a;
    a.func(1);

    会当做

    A::func(&a, 1);

    成员函数的原型是

    A::func(int);

    编译器处理后等价于

    A::func(A* const register this, int) //不要人为添加this声明,是编译器隐式生成的,否则报错

    而静态函数就没有this这个指针了。

    但是有一个问题,最近看面试书,里面提到了有一种设计模式,可将构造函数声明为private/protected,而后用静态成员函数调用构造函数。

    静态成员函数调用私有构造函数,嗯。

    如何实现呢?为什么能够行得通呢?

    明确一点,静态成员函数可以访问静态成员变量,全局变量,和自身的函数形参。

    所以,可以将对象做为static函数的形参传递进去

    比如

    static void A::Instance(A * const pa);

    而且,在静态函数Instance中,可以访问A的成员

    void A::Instance(A * const pa)
    {
           pa->func(); //func可以是非静态成员函数,而且无论private 还是protected
           pa->a; //可以访问非静态成员变量,无论private还是protected 
    }

    抑或在Instance中new一个A对象

    class A
    {
         public:
             static A* Instance();
         protected:
             A();
         private:
             static A* _instance;
    }
    
    //实现时
    A* A::_instance = NULL;
    
    A* A::Instance()
    {
         if( _instance == NULL )
         {
                 _instance = new  A();
          }
         return _instance;
    }

    不管是哪种方案,都是显式在静态函数中引入了一个对象。

    同时,我们注意到,static函数内部可以通过一个对象a,来无差别权限地访问各个成员函数和变量。

    这里涉及到一个作用域的问题。静态成员函数也是成员函数,所以在函数开头有A::来表明作用域,那么就可以在其中访问A的成员函数和变量。

    看来一个成员函数有两点需要我们注意,一个是this指针,还有一个就是作用域。

    上文所描述的,是设计模式中的单件模式,很巧妙的应用哈~

  • 相关阅读:
    docker 创建新的镜像到私有仓库
    docker 数据管理<1>
    docker 数据管理<1>
    docker 运行挂载磁盘
    docker 运行挂载磁盘
    docker 容器管理上
    docker 指定容器名字
    消息队列应用场景解析
    Apache软件基金会Member陈亮:一名开源拓荒者的 Apache之旅
    【干货贴】消息队列如何利用标签实现消息过滤
  • 原文地址:https://www.cnblogs.com/ShaneZhang/p/3722519.html
Copyright © 2011-2022 走看看