【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;
相关推荐
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 基于python的电影推荐系统为例,包含答辩的问题和答案
开发语言·python
星辰_mya2 小时前
Elasticsearch线上问题之慢查询
java·开发语言·jvm
Yu_Lijing2 小时前
网络复习篇——网络基础(一)
网络·c++·笔记
前端小菜袅2 小时前
PC端原样显示移动端页面方案
开发语言·前端·javascript·postcss·px-to-viewport·移动端适配pc端
Bella的成长园地2 小时前
为什么c++中的条件变量的 wait() 函数需要配合while 循环或谓词?
c++·面试
Highcharts.js2 小时前
如何使用Highcharts SVG渲染器?
开发语言·javascript·python·svg·highcharts·渲染器
charlee442 小时前
为什么现代 C++ 库都用 PIMPL?一场关于封装、依赖与安全的演进
c++·智能指针·raii·pimpl·编译防火墙·封装设计
郝学胜-神的一滴2 小时前
超越Spring的Summer(一): PackageScanner 类实现原理详解
java·服务器·开发语言·后端·spring·软件构建
摇滚侠2 小时前
Java,举例说明,函数式接口,函数式接口实现类,通过匿名内部类实现函数式接口,通过 Lambda 表达式实现函数式接口,演变的过程
java·开发语言·python
阿里嘎多学长2 小时前
2026-02-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管