【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();
		}
	};
}
相关推荐
云 无 心 以 出 岫1 小时前
贪心算法QwQ
数据结构·c++·算法·贪心算法
换一颗红豆2 小时前
【C++ 多态】—— 礼器九鼎,釉下乾坤,多态中的 “风水寻龙诀“
c++
随便昵称2 小时前
蓝桥杯专项复习——前缀和和差分
c++·算法·前缀和·蓝桥杯
commonbelive2 小时前
团体程序设计天梯赛——L1-100 四项全能
c++
genispan2 小时前
QT/C++ 多线程并发下载实践
开发语言·c++·qt
小卡皮巴拉3 小时前
【力扣刷题实战】矩阵区域和
开发语言·c++·算法·leetcode·前缀和·矩阵
Pacify_The_North3 小时前
【C++进阶三】vector深度剖析(迭代器失效和深浅拷贝)
开发语言·c++·windows·visualstudio
神里流~霜灭3 小时前
蓝桥备赛指南(12)· 省赛(构造or枚举)
c语言·数据结构·c++·算法·枚举·蓝桥·构造
扫地的小何尚3 小时前
NVIDIA工业设施数字孪生中的机器人模拟
android·java·c++·链表·语言模型·机器人·gpu
Zfox_3 小时前
【C++项目】从零实现RPC框架「四」:业务层实现与项目使用
linux·开发语言·c++·rpc·项目