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指针,还有一个就是作用域。

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

  • 相关阅读:
    开放API接口及其安全性
    suoyin
    正常关闭tomcat
    学生选课系统
    chrome浏览器Network面板请求Timing分析
    页面请求速度慢,TTFB时间长的问题分析
    javascript正则表达式
    Yahoo!团队经验:网站性能优化的34条黄金法则
    angular.js中提供的基础方法
    前端构建之--gulp
  • 原文地址:https://www.cnblogs.com/ShaneZhang/p/3722519.html
Copyright © 2011-2022 走看看