【C++特殊类的设计】

目录

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

cpp 复制代码
//设计一个类没有不能被拷贝
class CopyBan
{
public:
	//...
	CopyBan(CopyBan& cb) = delete;
	CopyBan& operator=(CopyBan& cb) = delete;
};

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

cpp 复制代码
//设计一个类只能在堆上创建
class HeapOnly
{
public:
	static HeapOnly* Create()
	{
		return new HeapOnly;
	}

	HeapOnly(HeapOnly& ho) = delete;
private:
	HeapOnly()
	{}
};
int main()
{
	HeapOnly* pho=HeapOnly::Create();
	//如果不封拷贝这样就在栈上创建对象了
	HeapOnly copy(*pho);
}

注意这里要将拷贝构造禁掉,

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

cpp 复制代码
//设计一个类只能在栈上创建
class StackOnly
{
public:
	static StackOnly CreateObj()
	{
		return StackOnly();
	}

	//不能禁掉拷贝构造
	//StackOnly(StackOnly& so) = delete;
	void* operator new(size_t size) = delete;
	void operator delete(void* p) = delete;
private:
	StackOnly()
	{}
};

四、请设计一个类,不能被继承

cpp 复制代码
// C++98中构造函数私有化,派生类中调不到基类的构造函数。则无法继承
class NonInherit
 {
 public:
 static NonInherit GetInstance()
 {
 return NonInherit();
 }
 private:
 NonInherit()
 {}
 };

五、请设计一个类,只能创建一个对象(单例模式)

5.1饿汉模式

就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。

cpp 复制代码
// 优点:简单
// 缺点:可能会导致进程启动慢,且如果有多个单例类对象实例启动顺序不确定。
//饿汉模式
class Singleton
{
public:
	static Singleton& CreateObj()
	{
		return _s;
	}

private:
	static Singleton _s;

	Singleton()
	{}

	Singleton(const Singleton& s) = delete;
	Singleton& operator=(const Singleton& s) = delete;
};
Singleton Singleton::_s;

5.2懒汉模式

如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时非常的缓慢。 所以这种情况使用懒汉模式(延迟加载)更好。

cpp 复制代码
// 懒汉
// 优点:第一次使用实例对象时,创建对象。进程启动无负载。多个单例实例启动顺序自由控
制。
// 缺点:复杂
namespace lazy
{
	class Singleton
	{
	public:
		static Singleton* CreateObj()
		{
			if (_s == nullptr)
			{
				_s = new Singleton;
			}
			return _s;
		}

		void DelSingleton()
		{
			if (_s)
			{
				delete _s;
				_s = nullptr;
			}
		}

	private:
		static Singleton* _s;

		Singleton()
		{}

		Singleton(const Singleton& s) = delete;
		Singleton& operator=(const Singleton& s) = delete;
	};
	Singleton* Singleton::_s = nullptr;

	class GC
	{
	public:
		~GC()
		{
			Singleton::CreateObj()->DelSingleton();
		}
	};
}
相关推荐
虾球xz14 分钟前
游戏引擎学习第280天:精简化的流式实体sim
数据库·c++·学习·游戏引擎
虾球xz1 小时前
游戏引擎学习第281天:在房间之间为摄像机添加动画效果
c++·人工智能·学习·游戏引擎
扶尔魔ocy1 小时前
【Linux C/C++开发】轻量级关系型数据库SQLite开发(包含性能测试代码)
linux·数据库·c++·sqlite
ptu小鹏1 小时前
list重点接口及模拟实现
数据结构·c++·list
__BMGT()2 小时前
C++ QT 打开图片
前端·c++·qt
顾子茵2 小时前
c++从入门到精通(五)--异常处理,命名空间,多继承与虚继承
开发语言·c++
YueiL4 小时前
基于RK3588的智慧农场系统开发|RS485总线|华为云IOT|node-red|MQTT
c++·物联网·华为云·rk3588·rs485
二进制人工智能4 小时前
【OpenGL学习】(二)OpenGL渲染简单图形
c++·opengl
Dream it possible!4 小时前
LeetCode 热题 100_寻找重复数(100_287_中等_C++)(技巧)(暴力解法;哈希集合;二分查找)
c++·leetcode·哈希算法
丶Darling.5 小时前
Day119 | 灵神 | 二叉树 | 二叉树的最近共公共祖先
数据结构·c++·算法·二叉树