C++进阶篇,特殊类设计

article/2024/3/2 11:45:19

C++进阶篇——特殊类设计

1. 设计一个不能被拷贝的类

拷贝只会发生在两个场景中:拷贝构造函数和赋值运算符重载,因此只需要禁止编译器生成这两个默认函数。

class CopyBan
{CopyBan(const CopyBan&) = delete;CopyBan& operator=(const CopyBan&) = delete;
};

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

只能在堆上创建意味着只能进行new或者malloc调用,就必须防止在栈上生成对象,需要禁止进行构造和拷贝构造的操作,我们将其设置为私有。

class HeapOnly
{
public:static HeapOnly* CreateObj(){return new HeapOnly;}
private:HeapOnly() {}HeapOnly(const HeapOnly&) = delete;
};

3. 设计一个只能在栈上创建对象

可以将构造函数私有化,然后设计静态方法在堆上创建对象并返回。然后禁用newdelete

class StackOnly
{
public:static StackOnly CreateObj(){return StackOnly();}// 禁掉operator new可以把下面用new 调用拷贝构造申请对象给禁掉// StackOnly obj = StackOnly::CreateObj();// StackOnly* ptr3 = new StackOnly(obj);void* operator new(size_t size) = delete;void operator delete(void* p) = delete;
private:StackOnly():_a(0){}
private:int _a;
};

4. 设计一个不能被继承的类

class A final
{// ...
};

5. 设计一个类,只能创建一个对象

单例模式:一个类只能创建一个对象,即为单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。

  • 饿汉模式:在程序启动的时候就创建一个唯一的实例对象。

    // 优点:简单
    // 缺点:可能会导致进程启动慢,并且如果有多个单例类会导致对象启动顺序不确定。
    class Singleton
    {
    public:static Singleton* GetInstance(){return &m_instance;}
    private:Singleton() {}// 防止拷贝Singleton(Singleton const&) = delete;Singleton& operator=(Singleton const&) = delete;static Singleton m_instance;
    };Singleton Singleton::m_instance; // 在程序入口前完成初始化操作
    
  • 懒汉模式:在使用的时候才进行创建对象。

    // 优点:第一次使用实例对象的时候才会创建对象。进程启动无负载,多个单例实例启动顺序自由控制。
    // 缺点:复杂class Singleton
    {
    public:static Singleton* GetInstance(){// 如果是第一次创建对象,必须保证创建对象的过程是一步到位的,所以使用锁操作来保证线程安全if(nullptr == m_pInstance){m_mtx.lock();if(nullptr == m_pInstance)m_pInstance = new Singleton();m_mtx.unlock();}return m_pInstance;}
    };private:// 构造函数私有Singleton(){};// 防拷贝Singleton(Singleton const&);Singleton& operator=(Singleton const&);static Singleton* m_pInstance; // 单例对象指针static mutex m_mtx; 			//互斥锁
    };Singleton* Singleton::m_pInstance = nullptr;
    mutex Singleton::m_mtx;
    

http://www.ngui.cc/article/show-841468.html

相关文章

ARP渗透与攻防(六)之限制网速攻击

系列文章 ARP渗透与攻防(一)之ARP原理 ARP渗透与攻防(二)之断网攻击 ARP渗透与攻防(三)之流量分析 ARP渗透与攻防(四)之WireShark截获用户数据 ARP渗透与攻防(五)之Ettercap劫持用户流量 ARP限制网速攻击 大家没想到吧,ARP还能限制对方网速。当kali欺骗了网关和受…

【每日数据结构与算法】

这里面有 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树; 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算 法、动态规划、字符串匹配算法。 文章目录一、 基本算法思想1-1 回溯1-2 动态规划dp1-3二、 排序2-1 O(n…

【多元统计分析】Python实现对应分析

(一)题目要求 数据集包含地区生产总值的四个相关指标:x1劳动者报酬,x2生产税净额,x3固定资产折旧,x4营业盈余。对各个地区生产总值进行对应分析,揭示不同地区的生产总值构成特征。要求&#xf…

深入学习Vue.js(十三)编译优化

文章目录动态节点收集与补丁标志1.传统diff算法的问题2.Block和PatchFlags3.收集动态节点3.渲染器运行时支持4.Block树静态提升预字符化缓存内联事件处理函数v-once动态节点收集与补丁标志 1.传统diff算法的问题 对于一个普通模板文件,如果只是标签中的内容发生了…

【算法竞赛 5】动态规划 ——— 闫氏DP分析法(从集合角度来分析DP问题——01背包)

目录 Description 输入格式 输出格式 数据范围 输入样例 输出样例: 题解 状态表示 状态计算 AC_Code 优化后代码 Description 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品…

许下你的新年愿望吧

好久没来了,因为太久没有学习过了,自从寒假开始每天都忙着玩,忙着弄一些自己喜欢的自媒体小兴趣,比如自己小红薯的经营、手账、公众号情感记录博文之类的,还要兼职写稿,所以很少打开CSDN了。今天写稿前打开…

OSG三维渲染引擎编程学习之二十八:“第三章:OSG场景组织” 之 “3.10 Switch开关节点”

目录 第三章:OSG场景组织 3.10 Switch开关节点 3.10.1 Switch介绍 3.10.2 Switch示例 第三章:OSG场景组织 在OSG中存在两个树:场景树、渲染树。其中,场景树是由一系列节点Node组成,这些节点Node可以是矩阵变换、状态变换,也可以是绘制对象等。场景树反映了场景的空间…

零基础学Python(全彩版)

ISBN: 978-7-5692-2225-8 编著:明日科技 页数:448页 阅读时间:2022-08-14 推荐指数:★★★★★ 一本非常适合入门的Python 3编程教程书籍, 不仅有视频教程还有很多的代码示例, 让你在一步步学习中掌握Pytho…

2.2 标识符与关键字

文章目录1 标识符2 关键字1 标识符 标识符可以简单的理解成一个名字。 在Java中,我们需要给代码中的很多元素起名,包括类名、方法名、字段名、变量名等等。我们给对应元素起的名称就被称为标识符,一个正确的标识符需要遵循以下规则&#xff…

恶意代码分析实战 4 识别汇编中的C代码结构

4.1 Lab06-01.exe 由main函数调用的唯一子过程中发现的主要代码结构是什么? 使用Strings进行查看,需要注意最后的这两个字符串,一个是“没有网”,另一个是“联网成功”。 IDA 中查看图结构。 明显是if-else结构。 位于0x4010…