当前位置: 首页 > news >正文

C++特殊类设计(详细介绍)

1.不能被继承的类

// final 关键字直接禁止继承 class NonInheritable final { public: // 类的功能实现 void DoSomething() {} }; // 错误示例:继承 final 类会编译报错 // class Derived : public NonInheritable {};

原理:
final 关键字修饰类时,编译器会直接禁止任何类继承它,语义清晰、实现简洁,是现代 C++ 的标准方案。

2. 只能在堆上创建的类

实现方案:

class HeapOnly { public: // 静态工厂函数:唯一创建入口(通过 new 在堆上分配) static HeapOnly* CreateInstance() { return new HeapOnly; } // 静态销毁函数:外部需调用此函数释放对象 void Destroy() { delete this; } private: // 私有构造函数:禁止外部直接创建栈对象 HeapOnly() = default; // 私有析构函数:禁止编译器自动调用(栈对象无法自动析构) ~HeapOnly() = default; // 禁止拷贝:防止通过堆对象拷贝生成栈对象 HeapOnly(const HeapOnly&) = delete; HeapOnly& operator=(const HeapOnly&) = delete; };

原理:
1.构造函数私有化,外部无法直接调用构造函数创建栈对象;
2.析构函数私有化,栈对象离开作用域时编译器无法自动调用析构,因此不能创建栈对象;
3.提供静态工厂函数,封装new操作,仅允许通过堆分配创建对象。

3. 只能在栈上创建的类

实现方案:

class StackOnly { public: StackOnly() = default; ~StackOnly() = default; private: // 私有化 new/delete 运算符,禁止堆分配 void* operator new(size_t) = delete; void operator delete(void*) = delete; // 同时禁止数组形式的堆分配 void* operator new[](size_t) = delete; void operator delete[](void*) = delete; }; // 使用示例 int main() { StackOnly obj; // ✅ 栈上创建,合法 // StackOnly* p = new StackOnly; // ❌ 编译报错,new 被禁用 return 0; }

原理:
new操作符底层会调用类的operator new,将其私有化并删除后,外部无法调用new在堆上分配对象,只能通过栈上直接创建。

4. 不能被拷贝的类

class NonCopyable { public: NonCopyable() = default; ~NonCopyable() = default; // 删除拷贝构造函数和拷贝赋值运算符 NonCopyable(const NonCopyable&) = delete; NonCopyable& operator=(const NonCopyable&) = delete; }; // 使用示例:继承此类即可获得不可拷贝特性 class MyClass : public NonCopyable { // 类的功能实现 };

原理:
C++11 引入的=delete关键字可以显式删除编译器默认生成的拷贝构造和赋值运算符,禁止任何形式的拷贝操作,常用于资源管理类(如智能指针)。

5. 只能创建一个对象的类(单例模式)

class Singleton { public: // 获取单例实例(C++11 静态局部变量天然线程安全) static Singleton& GetInstance() { static Singleton instance; // 仅初始化一次 return instance; } // 禁止拷贝和赋值 Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; private: // 私有构造/析构,禁止外部实例化 Singleton() = default; ~Singleton() = default; }; // 使用示例 int main() { Singleton& s1 = Singleton::GetInstance(); Singleton& s2 = Singleton::GetInstance(); // s1 和 s2 指向同一个对象 return 0; }

原理:
1.构造函数私有化,外部无法直接创建对象;
2.静态成员函数GetInstance提供唯一访问入口;
3.C++11 及以上版本中,静态局部变量的初始化是线程安全的,保证全局仅存在一个实例。

谢谢
http://www.zskr.cn/news/1484976.html

相关文章:

  • 2026年众智商学院中级经济师上班族晚间班期费用资料怎么核对?官网400冯老师 - 众智商学院官方
  • MATLAB实现GNSS+IMU组合导航仿真:EKF融合算法全流程可运行代码包
  • 央视连发三条专题!济南AI模型工厂:75道工序流水线量产,一年“造“出1000+模型
  • 从自动驾驶到电机控制:聊聊卡尔曼滤波这位‘跨界大神’的降维应用
  • 华硕笔记本性能管理神器:G-Helper轻量级控制工具完全指南
  • 2026年众智商学院PMP官网咨询入口:怎么报名和怎么选班期领取资料 - 众智商学院官方
  • 从0到1构建生产级RAG系统:架构、实战与避坑指南
  • 2026出圈!5款AI论文写作软件亲测,摆脱无效加班,初稿质量效率翻倍
  • 手把手教你配置TMS320F28335的SPI模块(含FIFO模式与自测代码)
  • Windows服务器可用的ASP电视直播站源码,含播放页与后台管理全套文件
  • Matlab图像分类教学包:20+生活场景图+全流程可运行代码(含视频帧处理)
  • 农产品全链条溯源系统:SpringBoot微服务+Fabric区块链实现从田间到餐桌的可信追踪
  • Jupyter Lab 3.x 用户注意:升级后IProgress报错的完整修复指南(含ipywidgets兼容性详解)
  • 单流检测:KCC 在独享链路时的行为切换
  • 轻松拿下OpenResty神器
  • SAP MM配置避坑指南:BP转供应商时,为什么必须勾选‘相同号码’?一个真实案例引发的思考
  • Streamlit:用 Python 快速构建数据应用
  • TDOA无源定位Chan算法MATLAB实现:含主程序、结果图与参数可调接口
  • 人力资源AI应用落地
  • 别再到处找图标了!手把手教你用Bootstrap Icons 1.7.2搞定前端项目
  • 遗传算法Python实战:N皇后问题从原理到稳定收敛
  • 多维聚合中的数据操纵:从GROUP BY到OLAP立方体的四次空间变换
  • 解决高并发多模态任务下的“状态漂移”:基于分布式任务管理的状态收敛实录
  • 信用分配的范式跃迁:当稀疏奖励遭遇百万 Token 长廊
  • AI 数据分析:智能可视化工具如何重塑数据分析工作流
  • MIMO-OFDM链路级仿真MATLAB工具包:含可调信道建模、空时编码与SNR评估功能
  • BackTrader本地实操包:A股日线数据+7步策略回测脚本,开箱即跑
  • 计算机界的“高考“:软考高项是一场持久战
  • mysql之udf提权
  • OPRD:蒸馏不只学答案,还要偷看老师的“脑内活动“