特殊类的设计----《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

【启发式算法】RRT算法详细介绍(Python)

【启发式算法】RRT算法详细介绍(Python)

📢本篇文章是博主人工智能(AI)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉启发式算法专栏:        【启发式算法】(8)---《RRT算法详细介绍(Python)》 【启发式算法】RRT算法详细介绍(Python) 目录  一、RRT算法的核心思想  二、基本流程  三、RRT算法伪代码 [Python] RRT算法实现 [Results] 运行结果 [Notice]  注意事项 四、RRT的特点 五、改进版本:RRT* 六、应用场景         RRT(Rapidly-exploring Random Tree)快速扩展随机树是一种采样式路径规划算法,广泛应用于机器人运动规划、自动驾驶、无人机路径设计等领域。它特别适用于高维空间中的路径规划问题。下面是对RRT算法的详细介绍:  一、

By Ne0inhk
从 0 到 1:用 Trae 插件 Builder 模式开发端午包粽子小游戏

从 0 到 1:用 Trae 插件 Builder 模式开发端午包粽子小游戏

前言 Trae插件获取:https://www.trae.com.cn/plugin 在编程的世界里,效率就是生命。我们开发者常常为了一个项目的搭建,重复着创建文件夹、初始化项目配置、编写样板代码等一系列繁琐的操作,耗费了大量的时间和精力。而如今,Trae 插件的 Builder 模式横空出世,为我们的编程之旅带来了一束全新的光亮。它就像是一个智能化的Ai工程师,能够理解我们的需求,快速搭建起项目的框架,极大地减少了重复性工作,让我们得以将更多的精力投入到核心逻辑的开发中。由于马上就要端午节了,那么接下来我将利用Trae插件的builder模式,带大家从0到1开发一个端午包粽子小游戏。 Trae插件builder模式介绍 什么是Trae 插件的Builder 模式呢?通俗点来说,就好比你想盖一座房子,正常情况下,你得先画图纸、挖地基、砌墙、装窗户等等,一步步来,这中间要操心好多琐碎又重复的活儿。而 Builder 模式就像是有个智能的建筑工人,你跟它说 “我要盖一座两层楼的别墅,要有个大大的客厅、三间卧室、一个花园”

By Ne0inhk

Python Selenium 超详细新手教程:从零开始掌握浏览器自动化

目录 一、写给新手的话 二、准备工作:环境搭建 2.1 安装Python(如果你还没有) 2.2 安装Selenium库 2.3 安装浏览器驱动管理工具 三、第一个Selenium程序:打开百度 四、Selenium基础操作详解 4.1 常用操作汇总表 4.2 详细操作示例 五、元素定位:找到网页上的内容 5.1 8种定位方式(从易到难) 方式1:通过ID定位(最简单) 方式2:通过NAME定位 方式3:通过CLASS_NAME定位 方式4:通过TAG_NAME定位 方式5:通过LINK_TEXT定位 方式6:通过PARTIAL_

By Ne0inhk
OpenClaw 都在排队养,你还在云端白嫖?手把手教你用 Python 搭建本地 AI 智能体(小白也能养自己的小龙虾)

OpenClaw 都在排队养,你还在云端白嫖?手把手教你用 Python 搭建本地 AI 智能体(小白也能养自己的小龙虾)

🦞 长文警告! 📜 文章目录(点击跳转,这波操作稳如老狗) 1. 前言:别再当云端 AI 的韭菜了,把“小龙虾”养在自己家 2. 第一步:给电脑装个“胃”——下载安装 Python(含官网地址) 3. 第二步:请个本地“大脑”——Ollama + Qwen 模型(白嫖党狂喜) 4. 第三步:搭个“龙虾笼子”——安装 OpenClaw(附项目地址) 5. 第四步:用 Python 写个“传话筒”,让你的小龙虾听你指挥 6. 第五步:第一次对话——你的本地贾维斯上线 7. 总结:白嫖虽好,但别让龙虾把你的电脑“钳”

By Ne0inhk