静态成员函数访问构造函数
在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指针,还有一个就是作用域。
上文所描述的,是设计模式中的单件模式,很巧妙的应用哈~