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


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

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





  • 相关阅读:
    工业级DTU无线数据传输终端
    4G DTU主要应用的场景
    4G DTU在油田远程监控中的应用
    模拟量采集模块哪个品牌好
    模拟量采集是什么?模拟量采集怎么应用?
    串行通信和串口通信有什么区别
    什么是模拟量,模拟量输出,模拟量输入
    嵌入式串口转以太网模块作用
    串口服务器和Modbus网关有什么不同
    SVN客户端的安装配置与使用
  • 原文地址:https://www.cnblogs.com/chengkeke/p/5417369.html
Copyright © 2020-2023  润新知