【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;
相关推荐
张宇Joaquin12 分钟前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
736c18 分钟前
C语言-数组 07
c语言·开发语言
宸津-代码粉碎机1 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
LorryJovens2 小时前
【LAAP科研】CEN因果等价网络理论---从双缝干涉到因果等价
开发语言·php
Brilliantwxx3 小时前
【Linux】 进程(10) 进程控制深度解析:创建、终止与等待
linux·运维·服务器·c语言·开发语言·网络
码匠许师傅4 小时前
【设计模式精讲】14.外观模式(Facade)
c++·设计模式·uml·外观模式
卢锡荣4 小时前
国产PD3.1全集成Type-C管控芯片LDR6020P
c语言·开发语言
Freak嵌入式4 小时前
Pico UART 数据收发实战:硬件配置、MicroPython 编程
java·开发语言·单片机·嵌入式硬件·生活
Casual4 小时前
【网络基础进阶】:看懂子网划分与 VLAN
开发语言·网络·php
cfm_29145 小时前
线程池阻塞队列
java·开发语言