【c++】特殊类的设计

在这里插入图片描述

💻文章目录

  • 📄前言
  • 🌻特殊类的设计
    • 无法被继承的类
    • 只能在堆开辟空间的类
    • 无法被拷贝的类
    • 只能在栈开辟空间的类
  • 🌺单例模式
    • 饿汉模式
    • 懒汉模式
  • 📓总结


📄前言

你可听说过只能在堆上创建的类、无法被拷贝的类、甚至是不能继承的类,如果你从未听闻过这样的奇妙的类设计,不妨点进本篇文章,来进入学习设计模式的第一步。

🌻特殊类的设计

当你看到这些要实现的特殊类,可能会感到困惑,为什么需要做出这种看似没有任何意义的类,此时不妨自己动手来实现一下它们,这些看似无用的设计,其实正是通向设计模式的第一步。

无法被继承的类

class NonInherit final	//c++11中,直接使用final即可
{NonInherit() {}
};class NonInherit	//c++98
{
private:NonInherit(){}	//私有构造函数即可阻止类被继承
}

只能在堆开辟空间的类

限制类的实例只能在堆上创建,可以通过构造函数私有化,然后通过一个静态的函数来创建类。

class HeapOnly
{
public:static HeapOnly* creat()	//静态函数来返回地址{return new HeapOnly;}
private:HeapOnly() {};		//设为私有HeapOnly(const HeapOnly&) = delete;
};

无法被拷贝的类

防止类的对象被拷贝,可以通过删除拷贝构造函数和赋值运算符来实现。

class Noncopy
{
public:Noncopy() {}Noncopy &operator=(const Noncopy &) = delete;	//也可设为私有Noncopy(const Noncopy &) = delete;
};

只能在栈开辟空间的类

只要在类内把拷贝函数和赋值函数给设为私有或者使用delete(c++11)即可做出在栈开辟空间的类。

class StackOnly
{
public:void* operator new(size_t) = delete;void operator delete(void*) = delete;static StackOnly create(){return StackOnly();}
private:StackOnly() {}
};

🌺单例模式

单例模式是一种常用的设计模式,其核心是确保程序中只能一个类只能拥有一个实例,从而实现资源重复利用性,减少性能的损耗。

有了上方特殊类的创建思路,就能更理解饿汉模式与懒汉模式

饿汉模式

饿汉模式,在程序加载类的时候就马上加载实例,这样一来就保证了实例的唯一性。

优点:

  1. 没有线程安全问题,因为在线程开始就被创建。
  2. 实现简单。

缺点:

  1. 可能会造成资源浪费,特别是在还没有用到实例的时候。
  2. 无法控制类的加载顺序,因为在程序加载时就运行,所以会拉慢程序加载速度。
class SingletonEager // 饿汉模式,正如其名一拿到资源就吃掉
{                    // 优点:简单、
public:              // 缺点:可能会造成资源的浪费,没有使用的情况static SingletonEager &getInstance(){return _instance;}private:SingletonEager(){};SingletonEager(const SingletonEager &) = delete;SingletonEager &operator=(const SingletonEager &) = delete;static SingletonEager &_instance;
};

懒汉模式

懒汉模式指的是在需要用到实例的时候再创建,以此来保证资源不被浪费。

优点:

  1. 减缓内存压力,如果没有用到实例则内存不会被分配。
  2. 加载速度较快。只有在使用时才被创建。

缺点:

  1. 线程安全问题:如果有多个线程同时访问类,需要自己保证资源不会被同时访问,出现二义性问题。
  2. 相比于饿汉模式,实现比较复杂。
class SingletonLazy // 懒汉模式,在需要使用到实例的时候再创建实例,杜绝了资源浪费。
{                   // 优点:
public:             // 缺点:SingletonLazy(const SingletonLazy &) = delete;SingletonLazy &operator=(const SingletonLazy &) = delete;static SingletonLazy *getInstance(){std::lock_guard(_mtx); // 多线程情况下,防止二义性情况出现。if (_instance == nullptr){_instance = new SingletonLazy;}} // lock_guard 会自动释放 RAIIprivate:SingletonLazy(){};static SingletonLazy *_instance;static std::mutex _mtx;
};

📓总结

设计模式是前人总结出来的开发模板,每一个程序员都应该对它们有所了解,设计模式大致分为三类:创建型、结构型、行为型,本篇介绍了创建型的单例模式,但细算设计模式,一共有23种之多,这些设计模式让我们日后再谈。

单例模式类型饿汉模式懒汉模式
优点:在程序启动时就完成了单例的初始化,保证了线程安全。实现简单。单例实例在需要时才被创建,可以节省资源。对于资源消耗较大的单例,或者在初始化过程中需要依赖参数的情况下非常有用。
缺点:如果程序启动后,单例未被使用,则会造成资源的浪费。初始化单例的过程可能会增加应用程序启动时间。需要在多线程环境下确保线程安全,实现相对复杂,可能会影响性能

📜博客主页:主页
📫我的专栏:C++
📱我的github:github

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/274959.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14双体系Java学习之数组

数组 ★小贴士 数组中保存固定数量的值,声明数组时需要制定数组中元素的类型,数组的长度在创建数组时设定。 保存数据的数据结构有很多,Java的标准函数库中就包含了许多复杂的数据结构,比如map、tree和set,以后会讲解的…

如何做代币分析:以 ARB 币为例

作者:lesleyfootprint.network 编译:mingfootprint.network 数据源:ARB 代币仪表板 (仅包括以太坊数据) 在加密货币和数字资产领域,代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关的数据…

【考研】高等数学总结

文章目录 第一章 极限 函数 连续1.1 极限存在准则及两个重要极限1.1.1 夹逼定理1.1.1.1 数列夹逼定理1.1.1.2函数夹逼定理 1.1.2 两个重要极限1.1.2.1 极限公式11.1.2.1.1 证明1.1.2.1.2 数列的单调有界收敛准则1.1.2.1.2.1 二项式定理1.1.2.1.2.2 证明 1.1.2.2 极限公式21.1.2…

Linux - 进程信号

1、信号入门 1.1、生活角度的信号 你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时, 你该怎么处理快递。也就是你能“识别快递”;当快递员到了你楼下,你也收到快递到来的通…

深圳市优质IDC服务商

深圳市南方联合科技有限公司是一家立足深圳、辐射全国的电信中立数据中心运营商,依托与电信运营商、IT 设备厂商在资源及渠道上的优势,借鉴业界成功运营经验,为用户提供持续、高速、安全的互联网数据中心服务(IDC)、企…

C#集合和数据结构,随笔记录

C#集合和数据结构 System.Collections命名空间包含接口和类,这些接口和类定义各种对象(如列表/链表、位数组、哈希表、队列和堆栈)的集合 System.Collections.Generic命名空间: 所有集合都直接或间接基于ICollection接口 列表类集…

Java项目:48 ssm008医院门诊挂号系统+jsp(含文档)

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本选题则旨在通过标签分类管理等方式实现 管理员;个人中心、药房管理、护士管理、医生管理、病人信息管理、科室信息管理、挂号管理、诊断…

案例--某站视频爬取

众所周知,某站的视频是: 由视频和音频分开的。 所以我们进行获取,需要分别获得它的音频和视频数据,然后进行音视频合并。 这么多年了,某站还是老样子,只要加个防盗链就能绕过。(防止403&#xf…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通标志识别系统详解(深度学习模型+UI界面代码+训练数据集)

摘要:本篇博客详细介绍了利用深度学习构建交通标志识别系统的过程,并提供了完整的实现代码。该系统采用了先进的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期版本进行了性能评估对比,分析了性能指标如mAP、F1 Score等。文章深入探…

细粒度IP定位参文2(Corr-SLG):A street-level IP geolocation method (2021年)

[2]S. Ding, F. Zhao, and X. Luo, “A street-level IP geolocation method based on delay-distance correlation and multilayered common routers,” Secur. Commun. Netw., vol. 2021, no. 1, pp. 1–10, 2021. 智能设备的地理位置可以帮助提供多媒体内容提供商和5G网络中…

Apache POI 解析和处理Excel

摘要:由于开发需要批量导入Excel中的数据,使用了Apache POI库,记录下使用过程 1. 背景 Java 中操作 Excel 文件的库常用的有Apache POI 和阿里巴巴的 EasyExcel 。Apache POI 是一个功能比较全面的 Java 库,适合处理复杂的 Offi…

【算法设计】实验四回溯算法(附源代码)

这里写目录标题 一、上机目的二、上机内容与要求三、上机步骤四、上机结果1、将课本5.2节算法改为程序,并输入数据及进行测试;2、自学5.4节,并完成符号三角形问题。 一、上机目的 1、通过回溯法的示例程序理解回溯法的基本思想; …

C语言--从零开始的扫雷游戏

C语言--从零开始的扫雷游戏 1. 游戏说明2. 总体代码3. 详细讲解3.1 菜单部分3.2 游戏主体部分3.2.1 总体分析3.2.2 棋盘初始化3.2.3 棋盘展示3.2.4 设置地雷3.2.5 扫雷阶段3.2.6 统计雷个数的代码3.2.7 使用迭代的方式进行展开:3.2.8 扫雷部分主体代码 4. 总结 1. 游…

图片格式转换怎么操作?这一个方法快快收藏

图片格式转换能够改变图片的质量、大小兼容性。不同的图片格式用途也不同,当我们需要转换图片格式的时候要怎么操作呢?下面,小编给大家分享一款操作简单,小白也能轻松上手的图片转换器(https://www.yasuotu.com/geshi&…

DDD领域模型驱动

传统MVC架构 DDD架构: api层:api请求方式,透传【传递参数】,几个业务对应api 业务层:做编排,业务里要有哪些服务,执行顺序是什么,以及怎么做 领域层:负责领域内调用,然后领域怎么划分 Dao层:数据库操作【或者另外一个应用 数据源之类的】 遵守原则: ①允许跨层…

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些?

什么是架构?架构设计原则是哪些?什么是设计模式?设计模式有哪些? 架构的本质 架构本身是一种抽象的、来自建筑学的体系结构,其在企业及IT系统中被广泛应用。 架构的本质是对事物复杂性的管理,是对一个企业、一个公司、一个系统复杂的内部关系进行结构化、体系化的抽象,…

php apache 后台超时设置

最近在写一个thinkphp项目的时候,发现Ajax从后端请求数据时间比较长,大概需要45秒左右,但是一旦请求时间超过40s,页面就会超时500了,一开始以为是ajax请求时间不能太长,后来将Ajax请求改为同步且timeout设置…

iTOP-3A5000开发板ATX规范设计外加机箱就是一台电脑主机

性能强 采用全国产龙芯3A5000处理器,基于龙芯自主指令系统 (LoongArch)的LA464微结构,并进一步提升频率,降低功耗,优化性能。 桥片 采用龙芯 7A2000,支持PCIE 3.0、USB 3.0和 SATA 3.0.显示接口2 路、HDMI 和1路 VGA&…

DARTS: DIFFERENTIABLE ARCHITECTURE SEARCH

DARTS:可微架构搜索 论文链接:https://arxiv.org/abs/1806.09055 项目链接:https://github.com/quark0/darts ABSTRACT 本文通过以可微分的方式表述任务,解决了架构搜索的可扩展性挑战。与在离散和不可微搜索空间上应用进化或强…

VR文化旅游虚拟现实介绍|虚拟现实元宇宙|VR设备购买

虚拟现实(VR)技术正在改变我们对文化旅游的认知和体验。通过VR技术,人们可以身临其境地探索世界各地的文化遗产和旅游景点,无需亲临现场也能感受到逼真的体验。以下是VR文化旅游虚拟现实的介绍: 身临其境的体验&#x…