关于C++的特殊类定制
特殊类定制
在C++中,一些特殊性质的类如何设计
类禁止拷贝的对象
- C++11 使用delete关键字赋值给拷贝构造和赋值
- C++98将拷贝构造和赋值声明在私有里
类只能在堆上创建的对象
- 将构造函数私有化, 提供一个获取对象堆上创建对象的公有函数
- 将析构函数私有化, 提供一个释放资源公有函数
类只能在栈上创建的对象
- 将构造函数私有化, 并提供一个获取栈上创建的对象的公有函数
然后将operator new函数禁用掉, 但是无法防拷贝(有一定缺陷)
不能被继承的类
- C++98将父类构造函数私有化
- C++11使用final关键字修饰父类
单例模式
一个类只能创建一个对象的类(singleton)
即只有唯一的实例对象
-
饿汉模式: 无论是否使用, 程序创建之前(main函数之前)就构造一个唯一的对象
- 先将构造函数私有化
- 使用私有的一个静态的、对应类型的实例化对象成员, 在类内声明, 类外初始化
- 提供一个静态成员函数获取到该对象
- 优点: 简单, 无线程安全问题
- 缺点
- 单例模式多可能会导致进程的启动慢
- 一个程序中, 有多个单例时, 无法控制其初始化的顺序
-
懒汉模式: 第一次使用对象时再创建实例对象
-
设计方式同饿汉基本相同, 但调用静态成员函数时(需要获取实例对象时)再创建实例对象(new 实例对象)
-
优点对应着饿汉的缺点
- 可以控制多个单例的初始化顺序
- 不影响启动顺序
-
缺点
-
线程安全问题
- 需要通过对应加锁, 以及双重判断进行保护
static ThreadPool<T> *getIntance(int num = g_thread_num){// 双重判断, 减少反复的加锁和解锁操作(因为只有第一次调用该方法时才会有线程安全问题, 之后都不会)// 加多一个判断, 后续再来的线程时, 则不需要再进行加解锁, 只用做一次判断即可(拦截了大量的无用的访问锁的行为->只有第一次访问锁有意义)if (pool == nullptr){LockGuard lock(&_smtx);if (pool == nullptr){pool = new ThreadPool<T>(num);}}return pool; }
-
-
-
单例对象的释放问题
- 一般情况下, 单例对象在整个程序运行期间都需要使用, 所以一般都是不释放的
单例对象在进程结束后也会进行资源释放 - 一些特殊场景需要释放, 如单例对象析构时, 需要进行一些持久化操作(往文件或者数据库写)
构建一个内嵌的垃圾回收类, 然后声明一个全局的垃圾回收对象, 当单例对象生命周期到时, 则会自动析构该垃圾对象, 同时释放单例对象资源
- 一般情况下, 单例对象在整个程序运行期间都需要使用, 所以一般都是不释放的
相关文章:
关于C++的特殊类定制
特殊类定制 在C中,一些特殊性质的类如何设计 类禁止拷贝的对象 C11 使用delete关键字赋值给拷贝构造和赋值C98将拷贝构造和赋值声明在私有里 类只能在堆上创建的对象 将构造函数私有化, 提供一个获取对象堆上创建对象的公有函数将析构函数私有化, 提供一个释放…...
Linux备份脚本
作用 Linux文件备份的作用较多,推荐以下几种: 保护文件:备份可以帮助用户保护文件,防止文件被意外删除或损坏。保证系统安全和应用安全:Linux系统管理人员对系统和业务应用要有一个合理的备份恢复策略,完…...
【Unity】实现轮盘抽奖
简介 示例一:使用协程完成轮盘转动 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class Lunpan : MonoBehaviour {[Tooltip("轮盘节点")]public Transform Roulette;[Tooltip("轮盘旋转的…...
面下对象之overload与override
简介 在面向对象编程中,重载(overloading)和重写(overriding)是两个不同的概念。 重载(Overloading)的定义 重载是同一个类中定义多个同名方法,但是这些方法具有不同的参数列表(参数个数、参数类型或参数顺序不同)。 当调用这个方法时,编译器会根据实际传入的参数自动选择对…...
大数据之Hive函数大全
🔧 Hive函数大全 更多大数据学习资料请关注公众号“大数据领航员"免费领取 一、数学函数 1、取整函数: round 1.函数描述 返回值语法结构功能描述doubleround(double a)返回double类型的整数值部分(遵循四舍五入) 2.例程 hive>…...
宝塔下应该用 Memcached 还是 Redis?
明月最近在跟几个使用宝塔面板的客户运维的时候发现不少站长不知道如何选择 Memcached 和 Redis,甚至都说不清楚 Memcached 或者 Redis 具体是用来干啥的?甚至还碰到过一个站长 Memcached 和 Redis 都安装了,但一个都没有用,就那么…...
恢复视频3个攻略:从不同情况下的恢复方法到实践!
随着科技的进步,我们的生活被各种各样的数字内容所包围,其中,视频因其独特的记录性质,承载着许多重要的资料。但不管是自媒体人还是普通人日常生活随手一拍,都会遇到误删视频的情况。为了帮助您找回手机视频࿰…...
从git上拉取项目进行操作
1.Git的概念 Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。它实现多人协作的机制是利用clone命令将项目从远程库拉取到本地库,做完相应的操作后再利用push命令从本地库将项目提交至远程库。 2.Git的工作流程…...
ES升级--01--环境准备和安装
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Linux 单机1.官网下载 Elasticsearchhttps://www.elastic.co/cn/downloads/past-releases/#elasticsearch 2.解压软件3.创建用户设置用户 es 密码 es赋权ES用户数据…...
Linux 防火墙 firewalld 常用命令
1 防火墙 - firewalld 1.1 开启防火墙 # 临时性开启,服务器重启后会恢复为原来的状态 systemctl start firewalld # 永久性开启(即开机启动),重启服务器后生效 systemctl enable firewalld1.2 关闭防火墙 # 临时性关闭…...
时间|基于SprinBoot+vue的时间管理系统(源码+数据库+文档)
时间管理系统 目录 基于SprinBootvue的时间管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农…...
C++青少年简明教程:for循环语句
C青少年简明教程:for循环语句 C的for循环语句是一种迭代控制语句,用于重复执行一段代码。 语法格式: for(表达式1;表达式2;表达式3) 循环体 for循环语句执行流程图: 不太好理解,请看下图&am…...
自动驾驶技术现状与需求分析
随着科技的不断进步和智能化浪潮的席卷,自动驾驶技术已成为当今交通领域的热点话题。本文旨在深入探讨自动驾驶技术的当前发展状况,并对其未来的市场需求进行细致分析。首先,我们将回顾自动驾驶技术的起源、发展历程以及当前的技术水平&#…...
SQL生成自然数,日历序列 浅析
01.sqlserver版本 使用sqlserver将数据复制n条 selectt.indx,t.name,tmp.vlue from (values(1,苹果) ) as t(indx, name) ,(select[number] as vluefrom master.dbo.spt_valueswhere [type] pand [number] between 1 and 10 ) as tmpspt_values是什么 spt_values是SQL Se…...
【数据结构(邓俊辉)学习笔记】二叉树04——Huffman树
文章目录 0. 概述1. 无前缀冲突编码2. 编码成本3. 带权编码成本4. 编码算法5. 算法实现流程6. 时间复杂度与改进方案 0. 概述 学习Huffman树。 1. 无前缀冲突编码 在加载到信道上之前,信息被转换为二进制形式的过程称作编码(encoding)&…...
arcgisPro将一个图层的要素复制到另一个图层
1、打开两个图层,如下,其中一个图层中有两个要素,需要将其中一个要素复制到另一个图层中,展示如下: 2、选中待复制要素,点击复制按钮,如下: 3、下拉粘贴按钮列表,选择【选…...
难兄难弟——Java中 goto 与 const关键字
目录 简洁版: 详解版: 一:goto 二:const 简洁版: 1: 在Java中,goto也是一个关键字,但是取消了goto的使用,使用循环标记进行代替; 2:在Java中&a…...
如何优化大文件读取时的性能
1、分块读取 1、不要一次性将整个文件加载到内存中,而是将其分割成多个较小的块(例如,每块1MB或更大),然后逐块读取和处理。 2、使用FileInputStream和BufferedInputStream来分块读取文件。 2、使用缓冲区 1、使用…...
【机器学习】Chameleon多模态模型探究
Chameleon:引领多模态模型的新时代 一、多模态模型的时代背景二、Chameleon模型的介绍三、Chameleon模型的技术特点四、Chameleon模型的性能评估五、Chameleon模型的代码实例 随着人工智能技术的深入发展,我们逐渐认识到单一模态的模型在处理复杂问题时存…...
cv2.imdecode 和 cv2.imread 的区别
cv2.imdecode 和 cv2.imread 都是 OpenCV 用于读取图像的函数,但它们用于不同的场景,处理方式也不同。 cv2.imread 用法: img cv2.imread(image_path)功能: cv2.imread 用于直接从文件系统中读取图像文件。image_path 是图像文件…...
避开这3个坑!Cortex-M3/M4使用DWT计数器时的常见错误与解决方法
Cortex-M3/M4开发实战:DWT计数器避坑指南与高阶应用技巧 在嵌入式系统开发中,精确的时间测量往往是性能优化和调试的关键。Cortex-M3/M4内核内置的DWT(Data Watchpoint and Trace)组件,特别是其CYCCNT计数器,为开发者提供了一个零…...
CYBER-VISION零号协议互联网舆情智能监测与分析系统
CYBER-VISION零号协议:构建你的互联网舆情智能监测雷达 最近和几个做市场、公关的朋友聊天,他们都在抱怨同一个问题:每天花大量时间刷新闻、看社交媒体,就为了捕捉行业动态和用户反馈,生怕错过什么重要信息。人工监测…...
为什么你的`@jit(cache=True)`反而变慢了?Python 3.14 JIT缓存键生成算法变更深度解析(附3.13→3.14 ABI不兼容警告)
第一章:Python 3.14 JIT 编译器性能调优 面试题汇总Python 3.14 引入了实验性内置 JIT(Just-In-Time)编译器,基于 PGO(Profile-Guided Optimization)与轻量级字节码重写机制,在 CPU-bound 场景下…...
阿里千问Qwen3.5-Omni:全模态大模型的新王者
Qwen3.5-Omni:全模态能力的新巅峰3月30日,阿里发布的千问新一代全模态大模型Qwen3.5-Omni,在音视频理解、识别、交互等215项任务中取得SOTA(性能最佳),超越Gemini-3.1 Pro,成为全球最强的全模态…...
QGC二次开发---多机协同任务中的智能框选与指令批量下发
1. 多机协同作业的核心痛点与解决方案 在农业植保、物流配送等需要多架无人机协同作业的场景中,操作人员经常面临一个棘手问题:如何快速选择特定区域的无人机并批量下发指令?传统方法需要逐个点击无人机图标,效率低下且容易出错。…...
nlp_structbert_sentence-similarity_chinese-large入门指南:从ModelScope下载到本地Web服务上线
nlp_structbert_sentence-similarity_chinese-large入门指南:从ModelScope下载到本地Web服务上线 你是不是经常需要判断两句话是不是一个意思?比如,检查用户提问是不是同一个问题,或者看看两段文案是不是在说同一件事。以前做这种…...
基于Ascend 950的Cube编程
直播回放链接:基于下一代硬件的Cube编程_哔哩哔哩_bilibili...
百川2-13B模型API调用详解:从Python安装到第一个成功请求
百川2-13B模型API调用详解:从Python安装到第一个成功请求 你是不是也对大模型API调用感到好奇,但一看到那些技术文档就头疼?别担心,今天咱们就来手把手走一遍,从零开始,用最简单的Python代码,完…...
硕博必看|论文盲审前,这些硬伤一定要避开!
作为过来人,太懂硕博生面对论文盲审的焦虑——熬夜完成的论文,查重、改格式、找导师签字后,仍怕因细节被盲审专家打回、延毕。盲审专家只看质量不看人情,很多不起眼的小问题,都可能成为“致命扣分点”。今天分享核心干…...
springboot+vue基于web的社区养老服务系统的设计系统
目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块分析服务预约模块社区互动模块后台管理模块技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块分析 用户…...
