【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();
		}
	};
}
相关推荐
沫璃染墨2 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
旖旎夜光5 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
小超人诞生日记5 小时前
C++ 智能指针的使用及其原理详解
c++·算法
akinggw6 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
繁星蓝雨7 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
旖旎夜光8 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
扶尔魔ocy9 小时前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件
akinggw10 小时前
libsherpacore - 基于 sherpa-onnx 的 C++ 语音交互静态库
c++·交互·语音识别
xiaoye-duck10 小时前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(中):全量响应实现和测试
网络·c++·语言模型·chatgpt