静态成员函数与私有构造函数(对单例模式的理解)

问题:单例模式中,静态函数中实例化了类对象,私有构造函数得到执行。构造函数是非静态成员函数,难道静态函数中能调用非静态函数吗?
  1. class Singleton
  2. {
  3. public:
  4. static Singleton * getInstance();
  5. private:
  6. Singleton();
  7. ~Singleton();
  8. static Singleton * m_sglton ;//(此处也可直接写为静态变量)
  9. };
  10. Singleton* Singleton:: m_sglton = NULL;
  11. Singleton *Singleton::getInstance()
  12. {
  13. if(m_sglton == NULL)
  14. {
  15. m_sglton = new Singleton; //注意这一句
  16. }
  17. return sglton;(返回对象)
  18. }

下面来分析下原因。
在开始正文之前,先复习一下C++静态成员
因为静态成员是与类相关联的,非静态成员是与对象相关联的。静态成员被所有对象共同拥有,且只有一份。静态数据成员不包含在任何一个对象内。静态成员函数不会隐式传入this,所以静态成员函数不能访问类的非静态成员。在单例模式中,我们发现利用静态成员函数调用中实例化了一个所属类的对象,且该类的构造函数为私有函数。

注意有个错误的说法静态成员函数只可以访问静态成员变量/静态成员函数不能访问非静态成员。静态函数没有默认的this对象指针。但是可以通过其他方式传入对象的地址,便可以在静态成员函数中访问到非静态成员函数。这种说法不够严密。仅仅是不能在静态成员函数中,使用this隐式或者显式调用非静态成员。因为静态函数不与对象绑定在一起,因此也不能声明成const的。

首先需要明确两点:
1、因为构造函数是私有的,要实例化该对象,就要访问类的私有域。而访问私有域必须在类的内部进行(即在class成员中)。但是在没有进行实例化之前,怎么能使用他的成员呢?----公有的静态成员函数可以做到。
2、经过测试,通过静态成员函数,可以调用私有的构造函数。

以上两点满足了单例模式才产生了!





原文地址:https://www.cnblogs.com/chengkeke/p/5417369.html