单例模式-懒汉式-饿汉式-c++

      饿汉式:

        饿汉式即在程序直接就会创建一个实例对象,他不是取决于你用不用他,而是本来就有的,上代码一看就明白:

class  SingleObject
{
public:
	static  SingleObject* GetInstance()
	{
		return &m_instance;
	}
private:
	// 构造函数私有
	SingleObject() {};
	SingleObject( SingleObject const&);
	SingleObject& operator=( SingleObject const&);
	static  SingleObject m_instance;

};
 SingleObject  SingleObject::m_instance;

 可以看到在类内声明了一个静态的类对象(类内声明,类外定义)。其实开始我有点疑惑:类内可以声明本类对象?这难道不是使用了不完整的类型吗?但是仔细想一下就会发现,

静态成员是类内声明,类外定义,也就是说在定义m_instance的时候已经是一个完整类型了,类似于在类成员函数中定义类对象是一个道理

静态成员以及函数是不占用类空间的。但是普通成员不行,因为普通成员函数并不是类外定义,占用类空间。

由于构造函数,拷贝构造等都被私有化,所以类外只能通过公共接口GetInstance()来获取唯一的一个实例。从代码可以看出,在你获取它之前,这个实例对象就已经存在了(可以与懒汉式对比着看)

懒汉式:

class SingleObject
{
private:
	SingleObject() {};//构造私有
	SingleObject(SingleObject const& s);//拷贝构造私有
	SingleObject& operator=(SingleObject const&);  //符号重载私有
private:
	static SingleObject* SinOb;  
public:

	static SingleObject* getSinOb()
	{
		if (SinOb == nullptr)
		{      
			SinOb = new SingleObject();

		}
		return SinOb;
	}

public:
	~SingleObject() {
		delete SinOb;
		SinOb = nullptr;
	}

};

 SingleObject* SingleObject::SinOb=nullptr;

此处不考虑线程安全。

可以看到懒汉式是当你第一次获取实例时它才会定义对象,以后每次当你获取实例它都会返回已有对象。

懒汉式在多线程中会产生问题,但这里就不做过多讨论了。

另外,这是之前写的,这里的代码还缺少了一个回收环节,应该在类中嵌套一个回收类用于回收实例!注意:不能在析构函数中回收,那会导致在回收的时候陷入循环

记录学习过程,如有错误,烦请指正,谢谢,啾咪

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值