C++特殊类的设计
文章目录
- 设计一个类不能被拷贝
- 请设计一个类,只能在堆上创建对象
- 设计一个类只能在栈上去创建对象
- 设计一个类不能被继承
- 设计一个类,只能创建一个对象(单例模式)
- 饿汉模式
- 懒汉模式
- 单例模式总结
- 饿汉模式
- 懒汉模式
设计一个类不能被拷贝
拷贝一个类对象可以有两种方式,分别是拷贝构造和赋值运算符重载函数,因此要想一个类不能被拷贝,只需在这两个函数上做文章就可以了。
1.只声明不定义(因为定义也没啥意义,反正也不会调用该函数),且设为私有函数
为什么要设为私有函数呢?
如果只声明为public的,可能用户会自己在类外进行定义实现,那么这个类就变得可以被拷贝了。
private:A(const A& a){}A& operator=(const A& a){}
2.把这两个函数给禁掉(C++11)
A(const A& a) = delete;
A& operator=(const A& a) = delete;
C++11中,通过关键字delete来禁用函数,如果在一个函数后面加上=delete就表示删除该默认成员函数
请设计一个类,只能在堆上创建对象
提供一个静态成员函数,该函数完成对象在堆上的创建,把构造函数设为私有,并把该类的拷贝构造函数和赋值运算符重载函数设成私有或者禁掉,防止别人调用在栈上生成对象。
class HeapOnly
{
public:static HeapOnly* CreatObject(){return new HeapOnly();}private:HeapOnly(){}HeapOnly(const HeapOnly& hp) = delete;HeapOnly& operator=(const HeapOnly& hp) = delete;};
这里为什么要把CreatObject设为static呢?
因为我们的返回值是new HeapOnly()创建这个对象,而如果不加static的话就需要先有HeapOnly()这个对象,才能去调用这个函数,而加了static修饰这个函数之后,这个函数就变成了属于属于这个类的了而不是这个对象的了,从而可以通过类去调用这个函数了
设计一个类只能在栈上去创建对象
通过静态成员函数去调用构造函数去创建对象,并把new和delete关键字给禁掉
class StackOnly
{
public:static StackOnly GetInstance(){return StackOnly();}void* operator new(size_t size) = delete;void operator delete(void* p) = delete;private:StackOnly():_a(0){}int _a;
};
设计一个类不能被继承
方法一:把基类的构造函数私有化
#include <iostream>using namespace std;class NonInherit
{
public:static NonInherit GetInstance(){return NonInherit();}private:NonInherit(){}
};class A : public NonInherit
{
private:int _a;
};
方法二:使用C++11关键字final进行修饰
#include <iostream>using namespace std;class NonInherit final
{
};class A : public NonInherit
{
};
设计一个类,只能创建一个对象(单例模式)
**单例模式:一个类只能创建一个对象,即单例模式,该模式可以保证系统中只有一个实例,并提供一个访问他的全局访问点,该实例被所有程序模块共享。**比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。
饿汉模式
#include <iostream>using namespace std;class Singleton
{
public: static Singleton& GetInstance(){return _instance;}private:Singleton(){cout << "Singleton()" << endl;}Singleton(const Singleton& _instance) = delete;Singleton& operator=(const Singleton& instance) = delete;static Singleton _instance;
};Singleton Singleton::_instance;
int main()
{/* Singleton a;Singleton b;*/cout << &Singleton::GetInstance()<< endl;cout << &Singleton::GetInstance() << endl;return 0;
}
类中的静态成员变量_instance是就是这个类对象,它是属于这个类的,且在函数体外进行了定义,所以在进入main函数之前该成员变量就被创建了。且在进入main函数之后,如果想再创建对象就必须调用类中的静态成员函数,而该函数返回的对象就是我们进入main函数之前创建的那个静态成员变量_instance,所以保证了每一次的得到的对象都是同一个。因为构造函数被私有,在后续创建对象时我们通过GetInstance()来创建对象时,不会调用构造函数,而是直接返回成员变量_instance
Singleton()
{cout << "Singleton()" << endl;
}
在进入main函数之前这句话就打印了,进入main函数之后创建对象时,因为不会在调用搞糟函数,所以这句话不会再被打印

饿汉模式缺点:如果类之间有依赖关系,或者占用空间过大就会导致启动速度减慢,需要花较长的时间才能进入main函数
懒汉模式
为什么叫懒汉模式?
因为该对象会在进入main函数之后,当你手动去创建时才会创建,而且在第一次之后创建的对象都与第一个是同一个
这里通过一个静态成员对象指针变量来控制,创建的是同一个,先给这个对象指针赋值为nullptr,当它为nullptr时,才给你创建对象,并把所创建对象的地址给静态成员变量指针,当不为nullptr时,你调用成员函数GetInstance()得到的是这个静态成员对象指针的解引用,也就是第一一次创建的对象的地址
#include <iostream>using namespace std;class Singleton
{
public:static Singleton& GetInstance(){if (_instance == nullptr){_instance = new Singleton;return *_instance;}return *_instance;}Singleton(const Singleton& sl) = delete;Singleton operator=(const Singleton& sl) = delete;private:Singleton(){}static Singleton* _instance;//单例对象指针
};Singleton* Singleton::_instance = nullptr;int main()
{cout << &Singleton::GetInstance() << endl;cout << &Singleton::GetInstance() << endl;//错误 C2280 “Singleton::Singleton(const Singleton&)”: 尝试引用已删除的函数//Singleton s = Singleton::GetInstance();return 0;
}
单例模式总结
饿汉模式
不管你将来是不是用这个实例对象,只要程序启动这个对象就被实例化出来,且全局始终只有这一个实例化对象。
优点:简单
缺点:可能会导致进程启动变慢,且如果有多个单例类对象实例,启动顺序不确定。如果这个单例对象在多线程高并发情况下频繁使用,性能要求较高,那么显然使用饿汉模式来避免资源竞争,提高响应速度更好。
懒汉模式
如果单例对象构造十分耗时或者占用资源,比如加载组件,初始化网络链接,读取文件等,且有可能这个对象在该程序运行时并不会被用到,那么在程序启动前就进行初始化就会导致程序启动非常缓慢,所以这种情况下,选用懒汉模式(延时加载)更好。
相关文章:
C++特殊类的设计
文章目录 设计一个类不能被拷贝请设计一个类,只能在堆上创建对象设计一个类只能在栈上去创建对象设计一个类不能被继承设计一个类,只能创建一个对象(单例模式)饿汉模式懒汉模式 单例模式总结饿汉模式懒汉模式 设计一个类不能被拷贝 拷贝一个类对象可以有…...
量化交易Copula建模应对市场低迷
一、简介 传统上,我们依靠相关矩阵来理解资产间的动态。然而,正如过去的市场崩盘所表明的那样,当风暴袭来时,许多模型都会陷入混乱。突然之间,相关性似乎趋于一致,而多样化这一经常被吹捧的风险管理口号似乎并没有提供什么庇护。 这种出乎意料的同步,即资产在经济低迷时…...
美创科技位居IDC MarketScape:中国数据安全管理平台市场「领导者」类别
近日,IDC发布《IDC MarketScape: 中国数据安全管理平台2023年厂商评估》 报告,报告从交付、产品特性、创新能力、研发速度、客户满意度等多个维度对国内厂商进行全面评估。美创科技列为『领导者』类别! ◼︎ 报告中,从关键战略指…...
Go语言变量的使用
基本语法——变量 一、变量的使用 1.1 什么是变量 变量是为存储特定类型的值而提供给内存位置的名称。在go中声明变量有多种语法。 所以变量的本质就是一小块内存,用于存储数据,在程序运行过程中数值可以改变 1.2 声明变量 var名称类型是声明单个变…...
在vitis中bit位赋值如何优化到一拍完成
使用vitis实现硬件代码时,经常遇到不是整拍对齐的情况,比如: ap_uint<128> a; ap_uint<64> b[10]; int pad,pos; /// 计算pos,pad ..... a(pos-1,0) b[pad](63,pos); a(63pos,pos) b[pad1]; a(127,64po…...
深度学习入门(二)之 简单手写数字识别实现
文章目录 引入MINIST数据脚本读入MNIST数据神经网络推理处理批处理 引入MINIST数据脚本 load_mnist为重要关注函数 params: normalize : 将图像的像素值正规化为0.0~1.0 one_hot_label : one_hot_label为True的情况下,标签作为one-hot数组返回 one-hot数…...
USART HMI串口屏+单片机通讯上手体验
USART HMI串口屏单片机通讯上手体验 🔖本文采用淘晶驰4.3寸IPS串口屏实物验证,HMI串口屏经简单配置即可快速实现,串口通讯效果。串口屏上手简单,有独立的开发套件,容易上手,驱动显示和功能代码独立。本文仅…...
Linux进程概念(1)
📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容为进程的概念做铺垫,主要介绍冯诺依曼体系结…...
uniapp 查看安卓第三方插件抛出的异常
0.安装好andriod studio 和hbuilder 1.配置环境变量 鼠标右键此电脑-》设置》关于》高级系统设置》环境变量》系统变量》path中加入 具体的hbuildr adb目录看个人 2.在cmd中输入命令adb version 查看是否配置成功 出现版本号就是配置成功了 3.去hbuilder中,导航栏运…...
美妆造型教培服务预约小程序的作用是什么
美业市场规模很高,细分类目更是比较广,而美妆造型就是其中的一类,从业者也比较多,除了学校科目外,美妆造型教培机构也有生意。 对机构来说主要目的是拓客引流-转化及赋能,而想要完善路径却是不太容易&…...
Pytorch常用函数
Pytorch 1 一些操作含义2 常用函数torch.squeezetorch.unsqueezetorch.transpose随机数生成Tensor详细内容 1 一些操作含义 下划线后缀含义: 在touch中函数后面加下划线代表是原位(In-place)操作,也就是内存的位置不变化,比如torch.add(valu…...
如何利用python连接讯飞的星火大语言模型
星火大模型是科大讯飞推出的一款人工智能语言模型,它采用了华为的昇腾910 AI处理器。这款处理器是一款人工智能处理器,具有强大的计算能力和高效的能耗控制能力。 华为昇腾910 AI处理器采用了创新的Da Vinci架构,这种架构在设计上充分考虑了…...
【Kubernetes 基本概念】Kubernetes 的架构和核心概念
目录 一、Kurbernetes1.1 简介1.2 为什么要用K8s?1.3 K8s的特性 二、Kurbernetes集群架构与组件三、Kurbernetes的核心组件3.1 Master组件3.1.1 Kube-apiserver3.1.2 Kube-controller-manager3.1.3 Kube-scheduler 3.2 配置存储中心——etcd3.3 Node组件3.3.1 Kubelet3.3.2 Ku…...
Docker安装部署Elasticsearch+Kibana+IK分词器
Docker安装部署ElasticsearchKibanaIK分词器 Docker安装部署elasticsearch拉取镜像创建数据卷创建网络elasticsearch容器,启动! Docker安装部署Kibana拉取镜像Kibana容器,启动! 安装IK分词器安装方式一:直接从github上…...
PCL setCameraPosition 参数讲解
setCameraPosition 的原型如下void setCameraPosition (double pos_x, double pos_y, double pos_z,double view_x, double view_y, double view_z,double up_x, double up_y, double up_z, int viewport 0);pos_x pos_y pos_z为相机所在的位置view_x view_y view_z 是焦点所…...
有关YOLOV5在测试时,图片大小被调整的问题
执行detect.py文件,在运行栏中出现以下: detect: weightsyolov5s.pt, sourcedata\images, datadata\coco128.yaml, imgsz[640, 640], conf_thres0.25, iou_thres0.45, max_det1000, device, view_imgFalse, save_txtFalse, save_confFalse, save_cropFa…...
【机器学习】四、计算学习理论
1 基础知识 计算学习理论(computational learning theory):关于通过“计算”来进行“学习”的理论,即关于机器学习的理论基础,其目的是分析学习任务的困难本质,为学习算法体统理论保证,并根据结…...
spring解决后端显示时区的问题
spring解决后端显示时区的问题 出现的问题: 数据库中的数据: 解决方法 spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: Asia/Shanghai...
大模型冷思考:企业“可控”价值创造空间还有多少?
文 | 智能相对论 作者 | 叶远风 毫无疑问,大模型热潮正一浪高过一浪。 在发展进程上,从最开始的技术比拼到现在已开始全面强调商业价值变现,百度、科大讯飞等厂商都喊出类似“不能落地的大模型没有意义”等口号。 在模型类型上࿰…...
ctfshow-web入门37-52
include($c);表达式包含并运行指定文件。 使用data伪协议 ?cdata://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg 是<?php system(cat flag.php);?> base64加密 源代码查看得到flag 38 多禁用了ph…...
JMeter WebSocket接口测试实战:从握手失败到万级压测
1. 为什么 WebSocket 测试不能只靠“点点点”——从一个线上告警说起上周五下午四点十七分,监控平台突然弹出三条红色告警:用户实时消息延迟超 3 秒、在线状态同步失败率陡升至 12%、某核心业务频道连接断开率在 5 分钟内从 0.03% 拉到 1.8%。运维同事第…...
2026年5月儿童护眼灯品牌推荐:TOP5排名书桌防蓝光评测
摘要 当儿童近视率持续攀升,家长在选购护眼灯时面临从“照亮”到“护眼”的认知升级,如何在琳琅满目的品牌中锁定真正科学有效的方案成为核心焦虑。根据世界卫生组织最新数据,全球儿童近视患病率预计在2050年将达到50%,而照明环境…...
Unity AI工作流:一句话生成可运行小游戏
1. 这不是“AI写代码”,而是用AI重构游戏开发工作流你有没有试过在Unity里搭一个最简单的飞行小游戏?比如让一只牛马角色在空中左右移动、避开障碍物、收集金币——传统做法是:新建场景、拖入Sprite、挂上Rigidbody2D、写Move脚本、写碰撞检测…...
3个关键维度重新定义工作价值:科学量化你的职业选择
3个关键维度重新定义工作价值:科学量化你的职业选择 【免费下载链接】worth-calculator Calculating the actual value of your job beyond just salary 项目地址: https://gitcode.com/gh_mirrors/wo/worth-calculator 你是否曾在深夜加班时思考,…...
文章三:Elasticsearch 集群恢复和索引分布
集群恢复网关与集群索引分布必要性了解在 Elasticsearch(简称 ES)集群运维中,集群重启恢复、残余索引处理、索引分片分布是保障集群稳定性、数据完整性、读写性能的三大核心基础能力。多数集群故障、数据丢失、分片异常、读写卡顿问题&#x…...
从COCO person_keypoints到YOLO格式:一份完整的姿态估计数据集转换脚本与避坑指南
从COCO到YOLO格式:姿态估计数据集转换实战手册在计算机视觉领域,姿态估计任务正从学术研究快速走向工业应用。许多开发者希望利用YOLO系列模型(如YOLOv8-Pose)进行训练,却常常在数据预处理阶段遇到障碍。本文将提供一套…...
【架构实战】解决长文本多轮对话中的“上下文腐化”问题:基于 Multi-Agent 的异步调度引擎设计
大家好,最近在研究 LLM 辅助编程和多角色对话时,我发现了一个非常头疼的问题:“上下文腐化”(Context Rot)。 当你在一个 Session 里塞入多个 System Prompt(比如试图让几个不同的 AI 角色在一个群里聊天&…...
ARM SME架构下的浮点外积运算优化实践
1. ARM SME架构与浮点外积运算概述在当代处理器设计中,SIMD(单指令多数据)架构已成为提升计算性能的关键技术。ARMv9引入的SME(Scalable Matrix Extension)指令集将这种并行计算能力提升到了矩阵运算层面,特…...
避坑指南:处理NOAA海温数据时,关于陆地掩膜、时间解析和面积加权的三个常见错误
NOAA海温数据处理实战:避开陆地掩膜、时间解析与面积加权的三大陷阱当分析NOAA OISST海温数据时,许多研究者会不自觉地掉进几个技术陷阱——这些错误看似微小,却足以让整个分析结果偏离真实。我曾亲眼见过一位同行因为忽略纬度权重校正&#…...
PostgreSQL COPY命令:高效数据导入的最佳实践
引言 在处理大量数据插入场景时,传统的INSERT语句往往会成为性能瓶颈。PostgreSQL提供了COPY命令,能够显著提升数据导入效率。本文将深入探讨COPY命令的工作原理、使用方法以及为什么它比普通INSERT更快。 什么是COPY命令? COPY是PostgreSQL提…...
