C++ 单例模式 Singleton

C++ 单例模式 Singleton

Singleton

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

实现要点

  • 构造函数应该声明为非公有,从而禁止外界创建实例。

  • 拷贝操作和移动操作也应该禁止。

  • 只能通过 Singleton 的公有特定类操作访问它的唯一实例(C++中的一个公有静态成员函数)。

  • C++11起,Singleton 最佳实现是静态局部对象的方法,该方法是线程安全的。C++11标准保证:如果多个线程试图同时初始化同一静态局部对象,则初始化严格只发生一次。见《C++ Concurrency in Action》Second Edition,Chapter 3.3.1,或者见 Static local variables - cppreference.com :

    If multiple threads attempt to initialize the same static local variable concurrently, the initialization occurs exactly once.

    之所以把类 Singleton 的唯一实例定义为 function-local static object 而非 static data member ,因为 static data member 本质上是 global object , global object 存在 initialization order 和异常安全方面的问题,见 StaticLocalVariable_GlobalVariable.md

Best Practices

#include <iostream>
#include <cassert>

class Singleton
{
public:
	static Singleton& Instance()
	{
		static Singleton instance;
		return instance;
	}
public:
	Singleton(const Singleton&) = delete;
	Singleton(Singleton&&) = delete;
	Singleton& operator=(const Singleton&) = delete;
	Singleton& operator=(Singleton&&) = delete;
private:
	Singleton() = default;
	~Singleton() = default;
};

int main()
{
	auto& a = Singleton::Instance();
	auto& b = Singleton::Instance();
	assert(&a == &b);

	return 0;
}

References

  • 11
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值