当前位置: 首页 > 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.jsqmd.com/news/973252/

相关文章:

  • 宝兰德BES中间件分离部署实战:用两个账号搞定生产环境安全隔离(附详细命令)
  • 基于STC89C52的三温区冰箱控制器:带DS18B20测温、机械式除霜检测、数码管/LCD双显示方案
  • 别再到处找了!我整理了全套Apriltag tag36H11视觉标定图(附高清下载链接)
  • 联盛德W806驱动ST7567液晶屏避坑指南:硬件SPI配置、内存偏移处理与对比度调校
  • 30张实拍舰船图+XML/TXT双标注,开箱即用YOLOv5训练
  • CAN错误处理机制:错误计数、错误状态和总线关闭
  • 2026年实测保姆级指南:查重AIGC爆表?豆包4大神仙指令+3款免费降AI工具降至5%! - 降AI实验室
  • Hadoop学习教程,从入门到精通, 初识Hadoop — 知识点详解(1)
  • C# WPF超市收银桌面程序源码包,含UI界面、数据访问层与完整运行截图
  • 从自动驾驶到电机控制:聊聊卡尔曼滤波这位‘跨界大神’的降维应用
  • 央视连发三条专题!济南AI模型工厂:75道工序流水线量产,一年“造“出1000+模型
  • 2026年众智商学院中级经济师上班族晚间班期费用资料怎么核对?官网400冯老师 - 众智商学院官方
  • 华硕笔记本性能管理神器:G-Helper轻量级控制工具完全指南
  • 2026年众智商学院PMP官网咨询入口:怎么报名和怎么选班期领取资料 - 众智商学院官方
  • MATLAB实现GNSS+IMU组合导航仿真:EKF融合算法全流程可运行代码包
  • JavaScript数组遍历性能与兼容性深度解析
  • 从GPS到北斗:手把手教你用Python解析NMEA-0183数据(附完整代码)
  • 手机存储速度翻倍的秘密:一文读懂UFS 2.2里的M-PHY物理层(附避坑指南)
  • 3步解决图像模糊难题:用vectorizer实现PNG/JPG到SVG的无损转换
  • 手把手教你配置TMS320F28335的SPI模块(含FIFO模式与自测代码)
  • AI Agent 运行时重构:会话即日志与无状态执行引擎
  • Open3D GUI踩坑实录:从‘Hello Sphere’到流畅3D界面的五个关键配置
  • 2026出圈!5款AI论文写作软件亲测,摆脱无效加班,初稿质量效率翻倍
  • 从0到1构建生产级RAG系统:架构、实战与避坑指南
  • Windows服务器可用的ASP电视直播站源码,含播放页与后台管理全套文件
  • 【MySQL | 第七篇】 索引使用规则
  • 新手也能看懂的BUUCTF SQL注入实战:从登录框到后台的304跳转注入点挖掘
  • 2026年湖州库存管理岗位SCMP四模块报名怎么问?众智商学院冯老师班期资料 - 众智商学院职业教育
  • 别再死磕官方案例了!用FNL数据从零搭建WRF(附避坑指南与完整namelist配置)
  • 别再手动打包了!新版Dubbo-Admin 0.3.0一键部署指南(Win/Linux通用,含Maven避坑)