单例模式 c++

一、单例是什么

全局有且只有一个类的static实例。

二、c++实现单例

2.1 一个好的单例应该具备下面4点

  • 全局只有一个实例:static特性,同时禁止用户自己声明并定义实例(把构造函数设为private)
  • 线程安全
  • 禁止拷贝和赋值
  • 用户通过接口获取实例:使用static类成员函数

2.2最推荐的懒汉式单例-局部静态变量

如果当变量在初始化的时候,并发同时进入声明语句,并发线程将会阻塞等待初始化结束。并发线程在获取静态变量的时候一定是初始化过的,具有线程安全性。

c++静态变量的生存期是从声明到程序结束,懒汉式。

cpp 复制代码
#include <iostream>
using namespace std;

class SingletonPattern_V3
{
public:
	~SingletonPattern_V3() {
		std::cout << "destructor called!" << std::endl;
	}
	//禁止赋值和拷贝
	SingletonPattern_V3(const SingletonPattern_V3&) = delete;
	SingletonPattern_V3& operator=(const SingletonPattern_V3&) = delete;
	//用户通过接口获取实例:使用static类成员函数
	static SingletonPattern_V3& Instance() {
		//局部静态变量特性,保证线程安全,全局只有一个实例
		static SingletonPattern_V3 m_pInstance;
		return m_pInstance;
 
	}
private:
	//禁止用户自己声明并定义实例(把构造函数设成private)
	SingletonPattern_V3() {
		std::cout << "constructor called!" << std::endl;
	}
};
 
int main()
{
	SingletonPattern_V3& instance_1 = SingletonPattern_V3::Instance();
	SingletonPattern_V3& instance_2 = SingletonPattern_V3::Instance();
 	system("pause");
	return 0;
}
相关推荐
浪子明X3 小时前
十六位账本怎样发现传输差错:Internet Checksum 生活类比
开发语言
GG-_-Bond4 小时前
9.1 kv存储resp协议模拟面试
c++
米糕闯编程5 小时前
鱼香ros2(五)用C++编写节点
c++·ros2·cmakelists·鱼香
xiangyun616 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun616 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
白远山8 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
fpcc8 小时前
计算机原理—构建过程中的分段分析
c++
xxwxx__8 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++
Escalating_xu8 小时前
【C语言常见概念】从第一行代码到字符串结束标志:一次打通编译、main、ASCII、转义字符与注释
c语言·c++
DevRay8 小时前
Java 21虚拟线程深度实战:告别线程池焦虑,百万并发吞吐量直接翻倍(原理+代码+避坑)
java·开发语言