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

问题:单例模式中,静态函数中实例化了类对象,私有构造函数得到执行。构造函数是非静态成员函数,难道静态函数中能调用非静态函数吗?
 
   
  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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值