【C++】特殊类设计

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

cpp 复制代码
	class Copyban {
	public:
		Copyban() {};
		Copyban(const Copyban& cp) = delete;
		Copyban& operator=(const Copyban& cp) = delete;
	};

如上设计的类通过delete禁止了拷贝构造和赋值,根据实际情景,还可以禁掉移动拷贝构造和移动赋值。

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

cpp 复制代码
	class Heaponly {
	public:
		static Heaponly* CreateObj()
		{
			return new Heaponly;
		}
	private:
		Heaponly() {};
		Heaponly(const Heaponly& h) = delete;
	};

将构造函数设为私有,这样在外部就不会在栈上创建对象,同时将拷贝构造屏禁掉,就不能通过拷贝构造在栈上创建对象了。

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

cpp 复制代码
	class stackonly {
	public:
		stackonly CreateObj()
		{
			return stackonly();
		}

		void* operator new(size_t size) = delete;
		void operator delete(void* ptr) = delete;
	private:
		stackonly():
			_a(0)
		{}
		int _a;
	};

将构造函数私有,这样在类外面就不能使用构造函数,同时为了避免new 的使用,重载new,将new禁掉。

四、创建一个类,只能创建一个对象

单例模式可以再细分为懒汉模式和饿汉模式,这两者的区别就在于在main函数之后才能生成对象,而饿汉模式在编译时就创建了对象。

特性 饿汉模式(类内 static 成员) 懒汉模式(函数内 static 变量)
是否需要类外定义 ✅ 是 ❌ 否
内存分配时机 程序启动时(main 前) 第一次调用函数时
初始化顺序风险 ⚠️ 有(Static Initialization Order Fiasco) ✅ 无
代码复杂度 较高(需 .cpp 文件) 极简(全在头文件)

所以现代 C++ 更推荐懒汉模式(用局部 static),不仅线程安全,还避免了定义分离和初始化顺序问题。

你现在完全理解了 C++ 静态成员的声明与定义机制!这是写出正确、可链接代码的基础。继续加油!

cpp 复制代码
class LazySingleton {
	public:
		static LazySingleton& getInstance()
		{
			static LazySingleton ls;
			return ls;
		}
		LazySingleton(const LazySingleton& ls) = delete;
		LazySingleton& operator=(const LazySingleton& ls) = delete;
	private:
		LazySingleton() = default;
	};

	class EagerSingleton {
	public:
		static EagerSingleton es;
		static EagerSingleton& getInstance()
		{
			return es;
		}
		EagerSingleton(const EagerSingleton& e) = delete;
		EagerSingleton& operator=(const EagerSingleton& e) = delete;
	private:
		EagerSingleton() = default;
	};
	EagerSingleton EagerSingleton::es;
相关推荐
端庄的战斗机18 分钟前
javascript 设计模式(文章很长,请自备瓜子,水果和眼药水)
开发语言·javascript·设计模式
Full Stack Developme1 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
疋瓞2 小时前
python和C++对比(1)_数据类型和数据结构
数据结构·c++·python
C语言小火车2 小时前
C++ 堆排序深度精讲:基于完全二叉树的选择排序进化,最坏情况 O(n log n) 的稳定王者
开发语言·c++·算法·排序算法·堆排序
北冥you鱼2 小时前
abigen 最佳实践:从入门到精通,高效生成 Go 语言合约绑定
开发语言·golang·区块链
ALex_zry3 小时前
C++26 std::complex 结构化绑定详解:auto [re, im] = c
c语言·开发语言·c++
她说..4 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
忧郁的紫菜4 小时前
基础实现:单篇 Markdown 转 Word
开发语言·c#·word
甜美的小天鹅5 小时前
Swifter C#之inline还是不inline,这是个问题
开发语言·c#
小短腿的代码世界5 小时前
Qt Bluetooth源码深度解析:从HCI协议到跨平台API的完整架构
开发语言·qt·架构