当前位置: 首页 > news >正文

编程语言中的特殊类的设计

文章目录

  • 不能被拷贝的类
  • 只能在堆上创建对象的类:
    • 方式一
    • 方式二
  • 设计类只能创建栈对象
  • 实现类, 不能被继承
  • 单例模式设计
    • 饿汉模式
    • 懒汉模式
      • 线程安全问题

不能被拷贝的类

c++98 只声明(不生成, 编译器默认会生成, 有浅拷贝等的问题), 不实现, 并将其访问设为private
在这里插入图片描述

c++11使用=delete来限制

只能在堆上创建对象的类:

只能在堆上创建对象的类:

方式一

在这里插入图片描述delete使用会自动调用析构函数, 所以要销毁这个堆对象, 两种方式:
在这里插入图片描述第二种:
在这里插入图片描述

方式二

构造函数私有化, 提供一个函数用于创建对象
在这里插入图片描述
这样的方式并不完整, 利用拷贝构造还是能创建栈对象
在这里插入图片描述
所以这样的方式还要禁止掉拷贝构造函数才完美

HeapOnly(const HeapOnly& ho) = delete;

设计类只能创建栈对象

私有构造函数, 提供一个接口实现:
在这里插入图片描述但是防不住这样的写法:

在这里插入图片描述

这样也不能禁用拷贝构造, 因为在CreateObj中返回局部对象的值要调用拷贝构造,
所以最好的方式是:禁用new 或者是私有化

在这里插入图片描述

实现类, 不能被继承

1.构造函数私有化
在这里插入图片描述
2.c++11final修饰符

在这里插入图片描述

设计模式的概念:被反复使用, 被熟人知晓, 经过分类的, 代码设计经验的总结
(c++是不太关注的, 一般是应用方面比较关注(像Java等语言), 常见的有23种, 这边只细讲单例模式)
迭代器 包装器(适配器)也算设计模式

单例模式设计

思想:对构造函数进行操作

饿汉模式

提前(main函数启动前)准备好,随时getinsert
在类内创建一个该类的对象(此时不允许, 不允许这样的方式来声明), 并且把这个类的对象设为static, 静态的不在对象里面.
这个对象的内存属于静态区, 访问权限属于private, 属于是类内的成员, 此时是属于声明, 定义需要使用类外定义

在这里插入图片描述
他的对象获取就需要使用这个方式

在这里插入图片描述同时要禁用拷贝构造和赋值构造:

完整代码及演示

class A
{
public:static A* GetInsert(){return &_inst;}void Add(const string& s1, const string& s2){_dict[s1] = s2;}void Print(){for (auto& e : _dict){cout << e.first << ":" << e.second << endl;}}
private:A() {}A(const A& a) = delete;A& operator=(const A& a) = delete;map<string, string> _dict;static A _inst;//先声明
};
A A::_inst;//定义
int main()
{A::GetInsert()->Add("sort", "排序");A::GetInsert()->Add("right", "向右");A::GetInsert()->Add("left", "向左");A::GetInsert()->Print();return 0;
}

结果演示
在这里插入图片描述

优点:
相比懒汉模式, 实现简单, 线程安全
缺点:
可能导致进程启动慢, 创建的单例对象首先会初始化很多
如果两个单例有启动先后顺序, 饿汉模式下无法控制
(导致问题的本质都是对象在main函数之前创建的有关)

懒汉模式

第一次用的时候再去创建(现吃现做)
与上述大致一致, 指向对象的指针初始化为nullptr
在类内构造的接口函数:

在这里插入图片描述
其他无异:


class B
{
public:static B* GetInstance(){if (_inst == nullptr){_inst = new B;}return _inst;}void Add(const string& s1, const string& s2){_dict[s1] = s2;}void Print(){for (auto& e : _dict){cout << e.first << ":" << e.second << endl;}}
private:B() {}B(const B& a) = delete;B& operator=(const B& a) = delete;map<string, string> _dict;static B* _inst;//先声明
};
B* B::_inst = nullptr;//定义
int main()
{B::GetInstance()->Add("sort", "排序");B::GetInstance()->Add("right", "向右");B::GetInstance()->Add("left", "向左");B::GetInstance()->Print();return 0;
}

结果演示:
在这里插入图片描述
懒汉模式下new出来的对象一般不需要进行释放, 进程正常退出会释放资源
但是终有万一: 有的操作下是在析构函数要把数据写入文件,期望是main函数结束自动调用
所以使用 :
1.智能指针
2.内部类(内部类是外部类的友元)
这边演示2 :
在这里插入图片描述
在这里插入图片描述

线程安全问题

对于懒汉模式, 当有两个线程同时第一个使用, 创建这个对象就有线程安全问题

在这里插入图片描述

单例模式最简单的写法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

欢迎随时来进行交流~~~

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • hyperf注解,自定义注解
  • 【第54课】XSS跨站Cookie盗取表单劫持网络钓鱼溯源分析项目平台框架
  • AList嵌入动态验证码实现动态校验
  • LaViT:Less-Attention Vision Transformer的特性与优点
  • 猫头虎 分享:如何用STAR(情境、任务、行动、结果)方法来结构化回答问题?
  • 网络安全-安全渗透简介和安全渗透环境准备
  • [开端]网络运维常用命令
  • 衡石科技BI的API如何授权文档解析
  • 基于微信小程序靓丽内蒙古APP(源码+定制+辅导)
  • SSRF漏洞与redis未授权访问的共同利用
  • 【案例58】WebSphere输出日志输出慢导致线程被阻塞
  • Windows安装nexus 私服仓库(6)
  • 【性能优化】:探索系统瓶颈的根源(一)
  • Modern restaurant - building and interior (餐厅场景)
  • linux命令 sudo and su
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【5+】跨webview多页面 触发事件(二)
  • CSS相对定位
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Node 版本管理
  • PHP的Ev教程三(Periodic watcher)
  • Vue 动态创建 component
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从0实现一个tiny react(三)生命周期
  • 高度不固定时垂直居中
  • 基于axios的vue插件,让http请求更简单
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 使用 QuickBI 搭建酷炫可视化分析
  • #android不同版本废弃api,新api。
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (七)理解angular中的module和injector,即依赖注入
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (一)Docker基本介绍
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • 、写入Shellcode到注册表上线
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Micro Framework初体验(二)
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .Net下的签名与混淆
  • @Transactional类内部访问失效原因详解
  • @vueup/vue-quill使用quill-better-table报moduleClass is not a constructor
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)
  • [1127]图形打印 sdutOJ