单例模型C++

本文介绍了单例模式的概念及其在C++中的实现方式,并通过代码示例对比了不同实现方法的效果,最终提供了一种有效的实现单例模式的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.概念

单例模式是一种常用的软件设计模式,只能生成一个实例对象的类是实现了Singleton(单例模型)的类型,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问.

二.代码实现

class Singleton
{
private:
	
private:
	Singleton()
	{
	}
public:
	static Singleton &getinstance()
	{
		static Singleton singleton;
		return singleton;
	}
};


分析:很多人在用C++实现Singleton时,首先想到的就是上面代码,其实上面代码是有问题的,不能实现单一实例。用static变量不是保证了对象的单一么?看看下面的测试你就明白了

int main()
{  
	
	Singleton p=Singleton::getinstance();
	Singleton q=Singleton::getinstance();
	cout<<"p :   "<<&p<<"   q :"<<&q<<endl;
	return 0;
}
结果:

为什么q,p的地址不一样了?q,p的地址不一样岂不是说明构建了多个实例?其实在此的确构建了不止一个实例,因为在

Singleton p=Singleton::getinstance();
Singleton q=Singleton::getinstance();
中调用了默认复制构造函数和默认赋值构造函数,生成了两个实例,所以q,p的地址不一样。那么要怎样解决了?

三.代码的改善与优化

让getinstance()函数返回指针类型可以完美的解决上面的问题

class Singleton
{
private:
	
private:
	Singleton()
	{
	}
public:
	static Singleton *getinstance()
	{
		static Singleton singleton;
		return &singleton;
	}
};
测试一下看看

int main()
{  
	
	Singleton *p=Singleton::getinstance();
	Singleton *q=Singleton::getinstance();
	cout<<"p :   "<<p<<"   q :"<<q<<endl;
	return 0;
}

结果:

p和q的地址是一样的,表明确实只生成了一个实例


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值