C/C++学习——单例模式(懒汉模式与饿汉模式)

C/C++学习——单例模式

  • 一、什么是单例模式?
  • 二、单例模式应用
  • 三、单例模式的特点
    • 注意:静态成员变量的使用
    • 示例代码:
  • 四、单例模式C++代码示例(饿汉模式)
  • 五、单例模式C++示例代码(懒汉模式)

一、什么是单例模式?

单例模式(Singleton Pattern)是一种创建型设计模式,用于确保在应用程序的生命周期内只存在一个特定类的唯一实例。这意味着无论何时请求该类的实例,都将返回同一个实例,而不会创建多个相同的对象。

二、单例模式应用

资源共享:当多个对象需要共享同一个资源,如数据库连接、文件系统、日志记录器等时,使用单例模式可以确保只有一个实例在管理这些资源,避免资源冲突和浪费。

全局控制:某些类负责管理全局的配置或状态信息。通过单例模式,可以确保在整个应用程序中只有一个配置管理器或状态管理器。

惰性初始化:某些对象的创建和初始化可能会很昂贵,只有在需要时才应该进行。单例模式允许延迟对象的创建,直到第一次请求它。

避免重复操作:有时需要确保只有一个对象负责某种操作,以避免重复执行。

三、单例模式的特点

私有的构造函数:单例类的构造函数必须是私有的,以防止外部代码直接实例化对象。

静态成员变量:通常单例类包含一个私有的静态成员变量,用于保存唯一实例的引用。

静态成员函数:通常单例类包含一个静态成员函数,用于获取唯一实例。这个函数通常会在内部检查是否已经创建了实例,如果没有,则创建一个新的实例并返回。

**

注意:静态成员变量的使用

**(静态成员变量是类的一部分,并不是类的实例的一部分同时静态成员函数不需要使用类的实例来调用,可以直接通过类名来调用

示例代码:

#include <iostream>
class Myclass
{
public:static void myPrint(); //静态成员函数声明
};
void Myclass::myPrint() //静态成员函数声明
{std::cout << "测试静态成员函数!\n" << std::endl;
}void test_1()
{/*静态成员函数是类的一部分,但不是类的实例的一部分;静态成员函数不需要使用类的实例来调用,可以直接通过类名来调用*/Myclass::myPrint();
}int main()
{test_1();return 0;
}

四、单例模式C++代码示例(饿汉模式)

结果:在没有使用该类的情况下也会实例化对象。

#include <iostream>//单例模式实现 示例
class Singleton
{private:static Singleton _eton; //静态成员变量_eton的声明,这里并没有定义//构造函数Singleton():_data(99) {std::cout << "单例模式构造!\n";}//删除拷贝构造,C++11特性Singleton(const Singleton&) =delete; //析构函数~Singleton(){}private:int _data;//对外提供的接口public:static Singleton &getInstance(){return _eton;}int getData(){return _data;}
};Singleton Singleton::_eton; //静态成员函数的定义int main()
{std::cout << Singleton::getInstance().getData() <<std::endl;return 0;
}

五、单例模式C++示例代码(懒汉模式)

懒汉模式:第一次使用要使用单例对象的时候创建实例对象。如果单例对象构造特别耗时或者耗费资源(加载插件、加载网络资源等),可以选择懒汉模式,在第一次使用的时候才创建对象

#include <iostream>class Singleton
{private:Singleton():_data(90){std::cout << "单例对象构造!\n" << std::endl;}Singleton(const Singleton&) = delete;~Singleton(){}private:int _data;public:static Singleton &getInstance(){static Singleton _eton;return _eton;}int getData(){return _data;}
};int main()
{std::cout << Singleton::getInstance().getData() << std::endl; //只有在实例化对象的时候才可以调用return 0;
}

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

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

相关文章

记一个有趣的bug:修改结构体中的切片不生效

问题描述&#xff1a;有一个interface类型的变量&#xff0c;把一个struct赋值给了它&#xff0c;类似下面这样 package mainimport "fmt"type ResData struct {Type stringSrcid stringSearchRes interface{} }type Data struct {name []string }func mai…

【线程同步】AQS抽象排队同步器(AbstractQueuedSynchronizer)

AQS(AbstractQueuedSynchronizer)抽象排队同步器 AbstractQueuedSynchronizer AQS就是AbstractQueuedSynchronizer类 AQS其实就是JUC包下的一个基类&#xff0c;JUC下的很多内容都是基于AQS实现了部分功能&#xff0c;比如ReentrantLock&#xff0c;ThreadPoolExecutor&#…

用变压器实现德-英语言翻译【01/8】:嵌入层

一、说明 本文是“用变压器实现德-英语言翻译”系列的第一篇文章。它引入了小规模的嵌入来建立感知系统。接下来是嵌入层的变压器使用。下面简要概述了每种方法&#xff0c;然后是德语到英语的翻译。 二、技术背景 嵌入层的目标是使模型能够详细了解单词、标记或其他输入之间的…

多模态知识学习

问题背景 海量多模态数据&#xff0c;人类认知事物也是多模态的深度学习为多模态联合学习奠定基础感知智能->认知智能多模态学习case&#xff1a;微软小冰、视频平台“只看TA”&#xff08;服务特定明星粉丝等&#xff1a;优酷、爱奇艺等&#xff09;需求&#xff1a;多模态…

实验室的服务器和本地pycharm怎么做图传

参考 远程调试 qt.qpa.xcb: could not connect to display, echo DISPLAY为空[已解决]_功夫小象的博客-CSDN博客 先安装x11 MobaXterm x11-forwarding_C--G的博客-CSDN博客 我是在容器中搞得 1&#xff0c;安装qt5 pip install PyQt5 -i https://pypi.douban.com/simple …

P5738 【深基7.例4】歌唱比赛

题目描述 n ( n ≤ 100 ) n(n\le 100) n(n≤100) 名同学参加歌唱比赛&#xff0c;并接受 m ( m ≤ 20 ) m(m\le 20) m(m≤20) 名评委的评分&#xff0c;评分范围是 0 0 0 到 10 10 10 分。这名同学的得分就是这些评委给分中去掉一个最高分&#xff0c;去掉一个最低分&#x…

java系统问题定位思路

一、在不同环境排查问题&#xff0c;有不同的方式 1、如果是在自己的开发环境排查问题&#xff0c;那你几乎可以使用任何自己熟悉的工具来排查&#xff0c;甚至可以进行单步调试。只要问题能重现&#xff0c;排查就不会太困难&#xff0c;最多就是把程序调试到 JDK 或三方类库内…

datax 使用

环境准备 List itemLinuxJDK(1.8以上&#xff0c;推荐1.8)Python(2或3都可以)Apache Maven 3.x (Compile DataX) 下载 wget https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz建立datax 用户 useradd datax ; echo "datax" | passwd -…

登录页面设计的7个小细节,帮你提升用户体验

移动 APP 登录页面的设计直接影响到用户体验&#xff0c;从而决定 APP 的成败。我们应该设计出令用户兴奋而不是沮丧的登录界面。下面就让我和你分享几个提升登录页面 UX 设计的技巧: 如果用户必须登录才能使用服务&#xff0c;那么需要仔细考虑登录表单。 在构建登录页面设计…

Nuxt3打包部署到Linux(node+pm2安装和运行步骤+nginx代理)

最近&#xff0c;我们项目组的工作接近尾声&#xff0c;需要把项目部署上线。由于前端第一次使用Nuxt3框架&#xff0c;后端也是第一次部署Nuxt3项目&#xff0c;所以刚开始出现了很多问题。在我上网搜索很多教程后&#xff0c;得到了基本的流程。 1.服务器安装node.js环境 N…

华为鲲鹏服务器

1.简介 鲲鹏通用计算平台提供基于鲲鹏处理器的TaiShan服务器、鲲鹏主板及开发套件。硬件厂商可以基于鲲鹏主板发展自有品牌的产品和解决方案&#xff1b;软件厂商基于openEuler开源OS以及配套的数据库、中间件等平台软件发展应用软件和服务&#xff1b;鲲鹏开发套件可帮助开发…

深入解析SNMP协议及其在网络设备管理中的应用

SNMP&#xff08;Simple Network Management Protocol&#xff0c;简单网络管理协议&#xff09;作为一种用于网络设备管理的协议&#xff0c;在实现网络设备的监控、配置和故障排除方面发挥着重要的作用。本文将深入解析SNMP协议的工作原理、重要概念和功能&#xff0c;并探讨…

C++自创题目——第一期

一、题目描述&#xff1a; 在一段时间内&#xff0c;到达港口的船有n艘&#xff0c;其中每艘船的信息包括:到达时间t(表示第t秒)&#xff0c;船上乘客数k&#xff0c;以及k名乘客的国籍。输出前3600s内每艘船上国籍种数&#xff0c;并输出国籍种数最少的船只的到达时间。 二、…

【llm论文】Scaling Instruction-Finetuned Language Models

https://arxiv.org/pdf/2210.11416.pdf 扩展任务数量&#xff1b;扩展模型大小&#xff1b;在chain-of-thought数据上微调。 提高模型能力。

docker使用harbor进行镜像仓库管理演示以及部分报错解决

目录 一.安装harbor和docker-compose 1.下载 2.将该文件修改为这样&#xff0c;修改好自己的hostname和port&#xff0c;后文的用户和密码可以不改也可以改&#xff0c;用于登录 3.安装 二.修改daemon.json文件和/etc/hosts文件 三.使用powershell作windows端域名映射 四…

【ArcGIS Pro二次开发】(63):批量更改字段别名

在我工作中遇到的大多数图斑&#xff0c;字段名称一般是英文&#xff0c;字段别名是中文&#xff0c;使用起来是比较方便的。 但有时候也会遇到一些不一样的情况&#xff0c;不知是经过了怎样的处理&#xff0c;图斑的字段别名被修改成了和字段名称一样的英文&#xff0c;这样…

[JAVA学习笔记]常用类

String类&#xff1a; 一、存放位置&#xff1a; 字符串对象创建好后不能修改 String是引用数据类型&#xff0c;但是这里作为方法参数传递的时候&#xff0c;效果跟基本数据类型是一样的。也就是说在堆中创建出来的字符串”monkey”是不能被改变的&#xff0c;如果…

ThinkPHP 资源路由的简单使用,restfull风格API

ThinkPHP 资源路由的简单使用&#xff0c;restfull风格API 一、资源控制器二、资源控制器简单使用 一、资源控制器 资源控制器可以轻松的创建RESTFul资源控制器&#xff0c;可以通过命令行生成需要的资源控制器&#xff0c;例如生成index应用的TestR资源控制器使用&#xff1a…

cyclictest stress 工具 使用

工具介绍 1. Cyclictest 准确且重复地测量线程的预期唤醒时间与它实际唤醒的时间之间的差异&#xff0c;以提供有关系统延迟的统计数据。 它可以测量由硬件、固件和操作系统引起的实时系统延迟 2.stress是Linux的一个压力测试工具&#xff0c;可以对CPU、Memory、IO、磁盘进行…

【车载雷达信号处理】利用sinc函数实现扣点

针对信号处理流程中多次FFT输出的频谱结果&#xff0c;在特殊的场景下&#xff0c;可能存在针对某一特定频点的固定"虚警"&#xff0c;所以针对某一个特定频点进行“扣点”的操作是常有的信号处理流程需求。不仅如此&#xff0c;针对最大能量值的扣点也能在不适合使用…