【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();
		}
	};
}
相关推荐
_F_y3 小时前
MySQL用C/C++连接
c语言·c++·mysql
兩尛3 小时前
c++知识点2
开发语言·c++
xiaoye-duck3 小时前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
Azure_withyou4 小时前
Visual Studio中try catch()还未执行,throw后便报错
c++·visual studio
琉染云月4 小时前
【C++入门练习软件推荐】Visual Studio下载与安装(以Visual Studio2026为例)
c++·visual studio
L_09076 小时前
【C++】高阶数据结构 -- 红黑树
数据结构·c++
智者知已应修善业9 小时前
【查找字符最大下标以*符号分割以**结束】2024-12-24
c语言·c++·经验分享·笔记·算法
91刘仁德9 小时前
c++类和对象(下)
c语言·jvm·c++·经验分享·笔记·算法
diediedei10 小时前
模板编译期类型检查
开发语言·c++·算法
mmz120710 小时前
分治算法(c++)
c++·算法