当前位置: 首页 > article >正文

C++-特殊类和单例模式

1.请设计一个类,不能被拷贝

拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可
//该类不能发生拷贝
	class NonCopy
	{
	public:
		NonCopy(const NonCopy& Nc) = delete;
		NonCopy& operator=(const NonCopy& Nc) = delete;
	};

 2.请设计一个类,只能在堆上创建对象

实现方式:
1. 将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。然后提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。
2.将类的析构函数私有,然后提供一个公有的Delete函数提供释放资源的功能。
//只能在堆上创建对象
	class OnlyHeap
	{
	public:
		OnlyHeap()
			:_a(0)
		{}

		void Delete()
		{
			delete this;
		}
	private:
		~OnlyHeap()
		{}

	private:
		int _a;
	};

 3. 请设计一个类,只能在栈上创建对象

思路:同上将构造函数私有化,然后设计静态方法创建对象返回即可。

//只能在栈上创建对象
	class OnlyStack
	{
	public:
		static OnlyStack GetInstance()
		{
			OnlyStack st;
			return st;
		}

		void* operator new(size_t n) = delete;
	private:
		OnlyStack()
			:_a(0)
		{}

	private:
		int _a;
	};

4. 请设计一个类,不能被继承

//该类不能被继承
	class NonInheritable final
	{};

 final关键字,final修饰类,表示该类不能被继承。

5.单例模式 

一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个
访问它的全局访问点,该实例被所有程序模块共享
单例模式有两种实现模式:
  • 饿汉模式
        就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。
// 饿汉模式 -- 一开始(main函数之前)就创建出对象
// 优点:简单、没有线程安全问题 
// 缺点:
// 1、一个程序中,多个单例,并且有先后创建初始化顺序要求时,饿汉无法控制。
// 比如程序两个单例类A 和 B,假设要求A先创建初始化,B再创建初始化。
// 2、饿汉单例类,初始化时任务多,会影响程序启动速度。
	class MemoryPool
	{
	public:
		static MemoryPool* GetInstance()
		{
			return _a;
		}
	private:
		MemoryPool()
		{}

		mutex mtx;
		static MemoryPool* _a;
	};
	MemoryPool* MemoryPool::_a = new MemoryPool;
  • 懒汉模式

如果单例对象构造十分耗时或者占用很多资源,这种情况使用懒汉模式(延迟加载)更好。 

/ 懒汉模式:第一次使用对象再创建实例对象
// 优点:
// 1、控制顺序。
// 2、不影响启动速度。

// 缺点:
// 1、相对复杂。(线程安全问题)
// 2、线程安全问题要处理好
	class Singleton
	{
	public:
		static Singleton* GetInstance()
		{
			if (_a == nullptr)//提高效率
			{
				_mtx.lock();
				if (_a == nullptr)//保护多线程
				{
					_a = new Singleton;
				}
				_mtx.unlock();
			}

			return _a;
		}

		static void Delete()
		{
			_mtx.lock();
			if (_a)
			{
				delete _a;
				_a = nullptr;
			}
			_mtx.unlock();
		}

		class GC
		{
		public:
			~GC()
			{
				Delete();
			}
		};

// 定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象
		static GC _gc;

	private:
		Singleton()
		{}

	private:
		static mutex _mtx;
		static Singleton* _a;
	};
	Singleton* Singleton::_a = nullptr;
	mutex Singleton::_mtx;
	Singleton::GC Singleton::_gc;
}

 

 

 


http://www.kler.cn/a/133804.html

相关文章:

  • 《Django 5 By Example》阅读笔记:p76-p104
  • change buffer:到底应该选择普通索引还是唯一索引
  • 成都睿明智科技有限公司解锁抖音电商新玩法
  • 1.7 JS性能优化
  • Linux 系统管理和监控命令---- auditctl命令
  • 前端开发中常用的包管理器(npm、yarn、pnpm、bower、parcel)
  • Leetcode—142.环形链表II【中等】
  • 基于springboot实现智能热度分析和自媒体推送平台系统项目【项目源码】
  • 将AI技术与VR元宇宙相结合的整体解决方案
  • 【Redis】zset常用命令集合间操作内部编码使用场景
  • 智能驾驶汽车虚拟仿真视频数据理解(一)
  • Java学习之路 —— Java高级
  • 2023-11-17 VsCode使用makefile进行多文件编译
  • 前端js常用代码段总结
  • 多功能神器,强劲升级,太极2.x你值得拥有!
  • Java Swing模拟银行自动取款机
  • OpenHarmony源码下载
  • mount /dev/mapper/centos-root on sysroot failed处理
  • python命名空间字典
  • git 相关指令总结(持续更新中......)
  • 力扣labuladong——一刷day38
  • 车载通信架构 —— 传统车内通信网络发展回顾
  • 微积分在神经网络中的本质
  • 基于JavaWeb+SpringBoot+掌上社区疫苗微信小程序系统的设计和实现
  • 腾讯微服务平台TSF学习笔记(一)--如何使用TSF的Sidecar过滤器实现mesh应用的故障注入
  • 二维码智慧门牌管理系统升级解决方案:查询功能大提升,让地址查找变得轻松便捷!