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

《C++ 递归、搜索与回溯》第1题:汉诺塔问题

《C++ 递归、搜索与回溯》第1题:汉诺塔问题

🔥个人主页:Cx330🌸 ❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》 《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔 《Git深度解析》:版本管理实战全解 🌟心向往之行必能至 🎥Cx330🌸的简介: 前言: 聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力 目录 前言: 递归,搜索与回溯算法前置知识 1. 汉诺塔 算法原理(递归): 思路: 算法流程: 解法代码(C++): 博主手记(字体还请见谅哈): 结尾: 递归,搜索与回溯算法前置知识 1. 汉诺塔 题目链接: 面试题 08.

By Ne0inhk
C++ 虚函数与纯虚函数:多态的核心实现基石

C++ 虚函数与纯虚函数:多态的核心实现基石

C++ 虚函数与纯虚函数:多态的核心实现基石 💡 学习目标:深度理解虚函数与纯虚函数的本质区别,掌握虚函数表的底层原理,能够灵活运用二者设计具备多态特性的类结构。 💡 学习重点:虚函数的声明与重写规则、纯虚函数与抽象类的使用场景、虚函数表的工作机制、虚函数的常见陷阱与解决方案。 一、虚函数的本质与定义 ✅ 结论:虚函数是 C++ 实现动态多态的核心,通过在基类成员函数前添加 virtual 关键字,允许派生类重写该函数,并在运行时根据对象的实际类型调用对应版本。 1.1 虚函数的声明语法 虚函数的声明必须在基类中进行,语法格式如下: class 基类名 {public:virtual 返回值类型 函数名(参数列表){// 函数体}}; 1.2 虚函数的核心特性 1. 运行时绑定:函数调用关系在程序运行时确定,而非编译时。 2. 重写规则:派生类重写的函数必须与基类虚函数的函数名、参数列表、返回值类型完全一致(协变类型除外)。 3.

By Ne0inhk
C++可变参数队列与压栈顺序:从模板语法到汇编调用约定的深度解析

C++可变参数队列与压栈顺序:从模板语法到汇编调用约定的深度解析

C++可变参数队列与压栈顺序:从模板语法到汇编调用约定的深度解析 本文聚焦一个具体而关键的技术主题:C++ 可变参数模板(Variadic Templates)。我们将从现代 C++ 的优雅写法出发,深入剖析其在 x86-64 架构下的真实行为,特别澄清一个长期被误解的核心问题——可变参数是否“从右向左压栈”?它们在寄存器和栈中究竟是如何排布的? 如果你正在实现一个类型安全的消息队列、日志系统或任务调度器,并希望理解 enqueue(1, "hello", 3.14) 这行代码在 CPU 层面到底发生了什么,那么这篇文章就是为你量身打造的。 一、引言:可变参数 ≠ va_list —— 一场范式革命 很多初学者将 C++ 的可变参数模板与 C 语言的 va_list 混为一谈。这是重大误区,甚至会导致错误的性能假设和安全漏洞。 1.1

By Ne0inhk

[特殊字符]2026 最新 C++ 学习路线图|从零基础到大厂 Offer|保姆级完整版(建议收藏)

简介:零基础学 C++ 最全路线,语法 + 进阶 + 高级 + 项目 + 面试一站式通关。 一、前言:为什么现在还要学 C++? 很多同学问我:Python、Java 这么火,还有必要学 C++ 吗? 答案非常肯定:必须学! C++ 是性能之王,是所有大厂后端、游戏、嵌入式、音视频、自动驾驶、数据库、中间件的核心语言。 1.1 C++ 就业方向 * 后端开发(字节、腾讯、阿里、百度、美团) * 游戏开发(Unity、Unreal、客户端、服务器) * 嵌入式 / 物联网 / 单片机 * 音视频、

By Ne0inhk