特殊类的设计----《Hello C++ Wrold!》(28)--(C/C++)

特殊类的设计----《Hello C++ Wrold!》(28)--(C/C++)

文章目录

前言

在 C++ 面向对象编程体系中,类是封装数据与行为的核心单元,其设计直接关系到程序的安全性、可维护性与性能表现。除了支撑常规业务逻辑的普通类,实际开发中常需面对具有特殊约束的场景:例如防止对象拷贝以规避资源重复释放风险,限定对象创建位置(仅堆或仅栈)以规范内存管理,禁止类被继承以保障核心逻辑不被篡改,或是确保类仅存在一个实例以实现全局资源统一调度 —— 这些需求的实现,正是特殊类设计的核心范畴。​

本文聚焦 “特殊类设计” 这一主题,系统拆解五种典型特殊类的实现逻辑与技术细节。从 “不能被拷贝的类” 对拷贝构造函数、赋值运算符的管控,到 “只能在堆 / 栈上创建对象的类” 对构造函数与内存分配接口的限制;从 “不能被继承的类” 基于构造函数私有化(C++98)与final关键字(C++11)的两种实现,到 “单例模式(仅一个对象的类)” 的饿汉模式与懒汉模式对比,每类设计均结合 C++ 语言特性,提供完整代码示例,并深入分析方案的优缺点与适用场景。​

无论是 C++ 学习者进阶理解类的设计边界,还是开发人员解决实际项目中的特殊类需求,本文都将通过清晰的原理讲解与实用的技术指引,助力读者掌握特殊类设计的核心思路,提升代码设计的严谨性与专业性。

设计一个不能被拷贝的类

只需让该类不能调用拷贝构造函数以及赋值运算符重载即可
C++98的方法: 将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有 C++11的方法: 用delete禁止生成拷贝构造函数和赋值运算符重载的默认成员函数 

设计一个只能在堆上创建对象的类

方法:

让这个类不能被拷贝并且构造函数设置成私有的

然后再提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建
实现举例:classHeapOnly{public:static HeapOnly*CreateObj(){returnnew HeapOnly;}private:HeapOnly(){//...}HeapOnly(const HeapOnly& hp)=delete; HeapOnly&operator=(const HeapOnly& hp)=delete;};

设计一个只能在栈上创建对象的类

方法:先把构造函数私有化 并且禁用operator new

然后再搞个静态成员函数去构造对象就行了(不搞成静态的话,没对象的时候调用不了)

–这里构造函数私有化的意义:防止外面eg: new A()这样
实现举例:classStackOnly{public:static StackOnly CreateObj(){ StackOnly st;return st;}private:StackOnly(){//...}void*operatornew(size_t size)=delete;};
引申:关于这里的operator new,这个的话默认调用的是全局的new,这类里面这样搞了之后这个类就用不了new

设计一个不能被继承的类

方法:

第一种:(C++98的方法):让构造函数私有化就行了

第二种(C++11的方法):用final关键字

设计一个只能创建一个对象的类(也叫做单例模式)

单例模式的概念:就是一个类只能创建一个对象

作用:该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享

单例模式的两种实现方法

饿汉模式

这个模式的优缺点:

优点:实现起来简单

缺点:1、如果单例对象初始化内容很多,影响启动速度
2、如果两个单例类,互相有依赖关系,这时候对实例化的顺序有要求–但是饿汉模式控制不了实例化的顺序(尤其是在不同的编译单元)

namespace hungry {classSingleton{public:static Singleton&GetInstance(){return _sinst;}private:Singleton(){// ...}//这里是防拷贝,自己演示的是C++11的方式Singleton(const Singleton& s)=delete; Singleton&operator=(const Singleton& s)=delete;static Singleton _sinst;}; Singleton Singleton::_sinst;

懒汉模式

在这里插入图片描述
namespace lazy {classSingleton{public:static Singleton&GetInstance(){if(_psinst ==nullptr){ _psinst =new Singleton;}return*_psinst;}staticvoidDelInstance(){if(_psinst){delete _psinst; _psinst =nullptr;}}classtmp{public:~tmp(){ lazy::Singleton::DelInstance();}};private:Singleton(){// ...}// 防拷贝Singleton(const Singleton& s)=delete; Singleton&operator=(const Singleton& s)=delete;static Singleton* _psinst;static tmp _tmp;}; Singleton* Singleton::_psinst =nullptr;//这意味着程序启动时,单例对象并没有被创建,仅仅是定义了一个指向它的空指针。 Singleton::tmp Singleton::_tmp;}
在这里插入图片描述
一般单例不需要释放:因为程序结束的时候,操作系统会自动去回收的(用的不是析构函数)

除非特殊场景:

1.中途需要显示释放 2.程序结束时,需要做一些特殊动作(比如持久化)

这里的第二种情况的持久化就是需要在程序结束时将数据写入其他地方–这个时候就需要调用析构函数,用析构函数写入–tmp就保证了他的析构函数会起作用

Read more

黄仁勋公开发文:传统软件开发模式终结,参与AI不必非得拥有计算机博士学位

黄仁勋公开发文:传统软件开发模式终结,参与AI不必非得拥有计算机博士学位

AI 究竟是什么?在 NVIDIA CEO 黄仁勋看来,它早已不只是聊天机器人或某个大模型,而是一种正在迅速成形的“新型基础设施”。 近日,黄仁勋在英伟达官网发布了一篇长文,提出一个颇具形象的比喻——AI 就像一块“五层蛋糕”。从最底层的能源,到芯片、基础设施、模型,再到最上层的应用,人工智能正在形成一整套完整的产业技术栈,并像电力和互联网一样,逐渐成为现代社会的底层能力。 这也是黄仁勋自 2016 年以来公开发表的第七篇长文。在这篇文章中,他从计算机发展史与第一性原理出发,试图解释 AI 技术栈为何会演化成如今的形态,以及为什么全球正在掀起一场规模空前的 AI 基础设施建设。 在他看来,过去几十年的软件大多是预先编写好的程序:人类设计好算法,计算机按指令执行,数据被结构化存储在数据库中,通过精确查询调用。而 AI 的出现打破了这一模式——计算机开始能够理解图像、文本和声音,并根据上下文实时生成答案、推理结果甚至新的内容。 正因为智能不再是预先写好的代码,而是实时生成的能力,支撑它运行的整个计算体系也必须被重新设计。

By Ne0inhk
猛裁1.6万人后,网站再崩6小时、一周4次重大事故!官方“紧急复盘”:跟裁员无关,也不是AI写代码的锅

猛裁1.6万人后,网站再崩6小时、一周4次重大事故!官方“紧急复盘”:跟裁员无关,也不是AI写代码的锅

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 过去几年里,科技公司几乎都在同一件事上加速:让 AI 参与写代码。 从自动补全、自动生成函数,到直接修改系统配置,生成式 AI 已经逐渐走进真实生产环境。但最近发生在亚马逊的一连串事故,却给整个行业泼了一盆冷水——当 AI 开始真正参与生产环境开发时,事情可能远比想象复杂。 最近,多家媒体披露,本周二亚马逊内部紧急召开了一场工程“深度复盘(deep dive)”会议,专门讨论最近频繁出现的系统故障——其中,一个被反复提及的关键词是:AI 辅助代码。 一周 4 次严重事故,亚马逊内部紧急复盘 事情的起点,是最近一段时间亚马逊系统稳定性明显下降。 负责亚马逊网站技术架构的高级副总裁 Dave Treadwell 在一封内部邮件中坦言:“各位,正如大家可能已经知道的,最近网站及相关基础设施的可用性确实不太理想。” 为此,公司决定把原本每周例行举行的技术会议

By Ne0inhk
这回真的“装”到了!来OpenClaw全国纵深行,你只需要带一台电脑……

这回真的“装”到了!来OpenClaw全国纵深行,你只需要带一台电脑……

AI Agent 的风,已经从 GitHub 吹到了线下。 过去几个月,越来越多开发者开始讨论一个问题: 当 AI 不再只是聊天,而是可以执行任务,软件会变成什么样? 在这股浪潮中,一个开源项目迅速进入开发者视野——OpenClaw,在 GitHub 上获得大量关注,相关教程、实践案例不断出现。有人用它自动整理资料,有人用它管理开发流程,还有人尝试让它执行复杂的工作流。 很多开发者第一次意识到: AI 不只是工具,它可能成为“执行者”。 不过,在技术社区之外,大多数人对 Agent 的理解仍停留在概念层面。 * AI Agent 到底是什么? * 如何在自己的电脑上运行? * 普通开发者能否真正用起来? 带着这些问题,一场围绕 OpenClaw 的开发者城市行动正在展开。 ZEEKLOG 发起的OpenClaw 全国纵深行将走进 20 个城市,用最直接的方式回答一个问题——如果

By Ne0inhk
字节辟谣「武汉全员被裁」:超2000人base武汉;315曝光给AI大模型“投毒”已成产业链;腾讯正式成为OpenClaw赞助商 | 极客头条

字节辟谣「武汉全员被裁」:超2000人base武汉;315曝光给AI大模型“投毒”已成产业链;腾讯正式成为OpenClaw赞助商 | 极客头条

「极客头条」—— 技术人员的新闻圈! ZEEKLOG 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:[email protected]) 整理 | 苏宓 出品 | ZEEKLOG(ID:ZEEKLOGnews) 一分钟速览新闻点! * 腾讯正式成为 OpenClaw 赞助商 * 字节辟谣「武汉全员被裁」:超 2000 人 base 武汉,将加大对湖北投入 * 2026 北京亦庄人形机器人半马完成首场练习测试 * 美团 CEO 王兴:我们都应该努力“减少登味”,内部不要再叫我“兴哥” * 向 AI 投毒已成产业链!315 晚会曝光 GEO 技术:虚构产品都能成 AI 标准答案 * 雷军官宣:新一代小米

By Ne0inhk