zoukankan      html  css  js  c++  java
  • 静态成员函数与私有构造函数(对单例模式的理解)

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

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





  • 相关阅读:
    SQL JOIN
    string.Empty, "" 和 null 三者的区别
    java JDBC
    java 自定义注解
    Spring Bean自动检测
    Spring Aware接口
    IObservable 接口
    CloseHandle()函数的使用
    [置顶] 记一次讲座与前辈的对话
    让用户关上门说话:覆盖全美6000个社区的邻居私密社交网站Nextdoor是如何壮大的?
  • 原文地址:https://www.cnblogs.com/chengkeke/p/5417369.html
Copyright © 2011-2022 走看看