静态成员函数访问构造函数

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

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

 

 

posted @ 2014-05-11 23:09  IT屁民  阅读(4380)  评论(0编辑  收藏  举报