静态成员函数与私有构造函数(对单例模式的理解)
问题:单例模式中,静态函数中实例化了类对象,私有构造函数得到执行。构造函数是非静态成员函数,难道静态函数中能调用非静态函数吗?
class Singleton
{
public:
static Singleton * getInstance();
private:
Singleton();
~Singleton();
static Singleton * m_sglton ;//(此处也可直接写为静态变量)
};
Singleton* Singleton:: m_sglton = NULL;
- Singleton *Singleton::getInstance()
{
if(m_sglton == NULL)
{
m_sglton = new Singleton; //注意这一句
}
return sglton;(返回对象)
}
下面来分析下原因。
在开始正文之前,先复习一下C++静态成员因为静态成员是与类相关联的,非静态成员是与对象相关联的。静态成员被所有对象共同拥有,且只有一份。静态数据成员不包含在任何一个对象内。静态成员函数不会隐式传入this,所以静态成员函数不能访问类的非静态成员。在单例模式中,我们发现利用静态成员函数调用中实例化了一个所属类的对象,且该类的构造函数为私有函数。
注意有个错误的说法:静态成员函数只可以访问静态成员变量/静态成员函数不能访问非静态成员。静态函数没有默认的this对象指针。但是可以通过其他方式传入对象的地址,便可以在静态成员函数中访问到非静态成员函数。这种说法不够严密。仅仅是不能在静态成员函数中,使用this隐式或者显式调用非静态成员。因为静态函数不与对象绑定在一起,因此也不能声明成const的。
首先需要明确两点:
1、因为构造函数是私有的,要实例化该对象,就要访问类的私有域。而访问私有域必须在类的内部进行(即在class成员中)。但是在没有进行实例化之前,怎么能使用他的成员呢?----公有的静态成员函数可以做到。
2、经过测试,通过静态成员函数,可以调用私有的构造函数。
以上两点满足了单例模式才产生了!