单例模式

单例模式是指一个类只能有一个对象。

饿汉模式

在单例模式下,在程序开始(main函数运行前)的时候创建一个对象,这之后就不能再创建这个对象。

class HungryMan
{
public:static HungryMan* getinstance(){return &inst;}
private:HungryMan(){}HungryMan(const HungryMan& it) = delete;const HungryMan& operator=(const HungryMan& it) = delete;static HungryMan inst;//这里是声明,并不是定义,所以可以在类里面包含//实际上是全局变量与类封装融合的结果
};HungryMan HungryMan::inst;//在类外定义

饿汉模式的实现方式较为简单,但存在线程安全(如果没加锁,可能会出现new了几个单例对象出来),可能导致进程启动慢(main函数启动之前需要创建对象),无法控制单例的初始化顺序(如果不同的单例模式在不同的文件,就无法确认初始化顺序,包括单例之间有可能存在依赖,也可能存在问题)的问题。

懒汉模式

在第一次使用的时候创建。

class LazyMan
{
public:static LazyMan* getinstance(){if (inst == nullptr){inst = new LazyMan();//new出来的数据是需要释放的,但懒汉对象大部分不需要手动释放//但这个对象并不是在程序层面上释放的,而是在系统回收资源的时候释放的//那如果我们需要保存一些数据的话,要保证main函数之后要自动调用懒汉类的析构函数}return inst;}static void delinstance(){if (inst == nullptr){delete inst;inst=nullptr;}}private:LazyMan(){}LazyMan(const LazyMan& it) = delete;const LazyMan& operator=(const LazyMan& it) = delete;static LazyMan* inst;class gc{~gc(){delinstance();}};static gc delgc;
};LazyMan* LazyMan::inst = nullptr;LazyMan::gc LazyMan::delgc;

IO流

c++的IO流

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类,c++这个IO流实际上是和C语言保持一致的,比如说istream对标的就是scanf和printf,fstream对标的是fscanf和fprintf,sstream对标的是sscanf和sprintf。
在这里插入图片描述
在类型转换中,对于内置类型,相近的类型可以互相转换,其他的可以由构造函数来支持转换,就像自定义类型可以转化为自定义类型,内置类型也可以转换为自定义类型,自定义类型也可以转化为自定义类型。

class tmp
{
public:operator int(){if(/*输入为ctrl+z*/){return 0;}else{return /*非0*/}}
};int main()
{tmp t;int i = t;return 0;
}

标准读写

所以cin可以直接使用while(cin>>tmp),当输入其他字符,返回值就为真,如果输入ctrl+z,返回值就是假,循环就退出了。
c++默认是兼容C语言的,当c++的cin和C语言的scanf混用的时候,并不会因为缓冲区的问题而导致读取混乱,如果想关掉这种兼容,可以调用下图的函数。

cin.sync_with_stdio(false);
cout.sync_with_stdio(false);

在这里插入图片描述

文件读写

在C语言中,fgetc和fputc是用来读单个字符的,fread和fwrite是用来读写文件的,fprintf和fscanf是用来格式化读写的,但这些只能用来对内置类型做操作,在c++里,ifstream是从文件里读,ofstream是写到文件里,可以应付内置类型和自定义类型的输入和输出。
二进制读写:如果要把内存中的数据存到磁盘里,内存中的数据是由类型的,而磁盘没有,我们可以使用二进制读写,也可以使用文本读写。比如说我们要把一个结构体按二进制的形式写到磁盘里:
在这里插入图片描述

class A
{
private:int a;char b;string c;
};class Bin
{
public:Bin(const char* filename="./info.bin"):_filename(filename){}void Write(){ofstream ofs(_filename, ios_base::out | ios_base::binary);A data;ofs.write((const char*)&data, sizeof(data));}void Read(A & rA){ifstream ifs(_filename, ios_base::in | ios_base::binary);ifs.read((char*)&rA, sizeof(rA));}private:string _filename;
};

在这里插入图片描述
我们可以用read再次读取,但这样是把数据原封不动的读回来,包括地址,但这样在同一个进程就会发生浅拷贝问题,析构两次,而如果是不同的进程读取,就会出现野指针问题,因为到后来的进程读取的时候,前面进程的空间早就销毁了,根据文件拷贝回来的地址就是一个野指针,所以只要是容器都要注意不能用二进制进行读取,因为容器底层都相对复杂。
文本读写:如果要正常读写到文件里和从文件里读出来,都要和字符串相互转化。但这样转化太麻烦,所以在C语言中,我们可以使用sscanf和sprintf转化完后用fwrite和fread写到文件里和读取。而在c++中重载了流插入和流提取,所以也不需要自己去做转换。

class Text
{
public:Text(const char* filename = "./info.text"):_filename(filename){}void Read(A& rA){ifstream ifs(_filename);ifs >> rA._a >> rA._b >> rA._c;}void Write(){A data(1, 'a', "hello world");ofstream ofs(_filename);ofs << data._a;ofs << data._b;ofs << data._c;//可以使用getline}
private:string _filename;
};

stringstream

自定义类型不方便转为字符串,所以可以调用stringstream。

class A
{
public:A(int a=0,char b='\0', string c=""):_a(a),_b(b),_c(c){}int _a;char _b;string _c;
};ostream& operator << (ostream & os, A aa)//必要手动写格式
{os << aa._a << '/' << aa._b << '/' << aa._c;return os;
}int main()
{A tmp(20, 'a', "hello world");ostringstream oss;oss << tmp;string out = oss.str();cout << out << endl;return 0;
}

在这里插入图片描述
但stringstream并不会用于比较复杂的情景,比较复杂的情景可以使用json。

class Date
{
public:Date(int _year,int _month,int _day):year(_year),month(_month),day(_day){}int year;int month;int day;
};
istream& operator>>(istream& is, Date& d)
{is >> d.year >> d.month >> d.day;return is;
}ostream& operator<<(ostream& os, Date& d)
{os << d.year <<' ' << d.month<<' ' << d.day << ' ';return os;
}
class Parent
{
public:Parent(int a1,char b1,Date c1):a(a1),b(b1),c(c1){}int a;char b;Date c;
};ostream& operator<<(ostream& os, Parent& p)
{os << p.a <<' ' << p.b<<' ' << p.c << ' ';return os;
}istream& operator>>(istream& is, Parent& p)
{is >> p.a >> p.b >> p.c;return is;
}int main()
{Date d1(2025, 8, 16);Parent p1(10, 'a', d1);ostringstream os;os << p1;Date d2(2024, 9, 18);Parent p2(20, 'b', d2);istringstream is(os.str());is >> p2;return 0;
}

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

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

相关文章

Java设计模式之依赖倒置原则使用举例说明

示例1&#xff1a;司机驾驶汽车 问题场景&#xff1a;司机类直接依赖奔驰车类&#xff0c;新增宝马车需修改司机类代码。 // 未遵循DIP class Benz { public void run() { /*...*/ } } class Driver { public void drive(Benz benz) { benz.run(); } } // 遵循DIP&#xff1a;…

【Docker】openEuler 使用docker-compose部署gitlab-ce

docker-compose配置 services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwayshostname: gitlab.example.comenvironment:GITLAB_OMNIBUS_CONFIG: |# Add any other gitlab.rb configuration here, each on its own lineexternal_url https://gi…

ElasticSearch 父子文档使用简记

一. ES parent-child 文档简介 ES 提供了类似数据库中 Join 联结的实现&#xff0c;可以通过 Join 类型的字段维护父子关系的数据&#xff0c;其父文档和子文档可以单独维护。 二. 父子文档的索引创建与数据插入 ES 父子文档的创建可以分为下面三步&#xff1a; 创建索引 M…

【Linux】编辑器vim的使用

目录 1. vim的基本概念 2. vim的基本使用 3. vim命令模式操作 3.1 移动光标 3.2 删除 3.3 复制 3.4 替换 3.5 撤销 3.6 更改 3.7 跳转 4. vim底行模式操作 4.1 列出行号 4.2 跳到文件中的某行 4.3 查找字符 4.4 保存文件 4.5 离开vim 1. vim的基本概念 Vim&…

《零基础掌握飞算Java AI:核心概念与案例解析》

前引&#xff1a;飞算科技是一家专注于企业级智能化技术服务的公司&#xff0c;核心领域包括AI、大数据、云计算等。其Java AI解决方案主要面向企业级应用开发&#xff0c;提供从数据处理到模型部署的全流程支持&#xff01;飞算Java AI是一款基于人工智能技术的Java开发辅助工…

Chrome腾讯翻译插件transmart的安装

文章目录一、官网地址二、安装过程1. 下载插件2. 解压crx3, chrome安装三、如何使用一、官网地址 腾讯翻译插件官网 二、安装过程 1. 下载插件 点击上面的官网地址&#xff0c;下拉到如图所示chrome插件位置&#xff0c;点击立即下载 2. 解压crx 从压缩文件中解压出crx文…

IOMMU的2级地址翻译机制及多级(2~5)页表查找

IOMMU的2级地址翻译机制及多级(2~5)页表查找 摘要:IOMMU是现代计算机系统中用于I/O设备(如GPU、NIC、网络接口卡)的地址翻译和保护机制,类似于CPU的MMU(Memory Management Unit),但专为设备DMA(Direct Memory Access,直接内存访问)设计。它支持虚拟化环境(…

C++STL标准模板库详解

一、引言STL&#xff08;Standard Template Library&#xff09;是 C 标准库的核心组成部分&#xff0c;其中容器&#xff08;Containers&#xff09; 作为数据存储的基础组件&#xff0c;为开发者提供了丰富的数据结构选择。本文将聚焦 STL 容器的核心类型&#xff0c;结合具体…

神经网络 常见分类

&#x1f4da; 神经网络的常见分类方式可以从不同角度来划分&#xff0c;以下是几种主流思路&#xff0c;帮你快速梳理清晰&#xff1a;1️⃣ 按网络结构分类前馈神经网络&#xff08;Feedforward Neural Network, FNN&#xff09; 数据从输入层→隐藏层→输出层单向传递&#…

生产环境Redis缓存穿透与雪崩防护性能优化实战指南

生产环境Redis缓存穿透与雪崩防护性能优化实战指南 在当下高并发场景下&#xff0c;Redis 作为主流缓存组件&#xff0c;能够极大地提升读写性能&#xff0c;但同时也容易引发缓存穿透、缓存击穿及缓存雪崩等问题&#xff0c;导致后端依赖数据库的请求激增&#xff0c;系统稳定…

【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、洛谷刷题、C/C基础知识知识强化补充、C/C干货分享&学习过程记录 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人…

嵌入式硬件篇---常见的单片机型号

以下是目前常用的单片机型号及其应用场景、优劣势的详细解析&#xff0c;结合最新行业动态和技术特性&#xff0c;帮助你精准匹配需求&#xff1a;一、经典 8 位单片机&#xff1a;低成本入门首选1. 51 系列&#xff08;代表型号&#xff1a;AT89C51、STC89C52&#xff09;应用…

windows下ArcGIS 10.8.2下载安装教程

ArcGIS是由美国环境系统研究所&#xff08;Esri&#xff09;开发的一款功能强大且应用广泛的综合性地理信息系统&#xff08;GIS&#xff09;软件平台&#xff0c;在空间数据的采集、管理、分析、可视化和共享等方面表现出色&#xff0c;是GIS领域的标杆产品。它拥有丰富的功能…

防御保护15

混合密码体系 --- 数字信封 逻辑 --- 先用快速的对称密钥来对消息进行加密&#xff0c;保证数据的机密性。然后只需要保证对称密钥的机密性即可&#xff0c;使用公钥密钥体系来对对称秘钥消息进行加密。身份认证和数据认证技术 Hash散列 指纹 ---> 单向散列函数 Hash --->…

Linux上管理Java的JDK版本

1.alternatives简介alternatives是 Linux 系统&#xff08;尤其是 ​​RHEL/CentOS/Fedora​​ 等基于 RPM 的发行版&#xff09;中用于管理​​同一软件多个版本​​的系统工具。它通过维护符号链接&#xff08;软链接&#xff09;的层级结构&#xff0c;帮助用户在不冲突的情…

webrtc编译arm/arm64

webrtc版本 m125版本 编译arm sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf //下载失败,需要多次尝试 python3 build/linux/sysroot_scripts/install-sysroot.py --arch=arm //python3 bui

【读论文】医疗AI大模型:百川开源Baichuan-M2

1. 引言 最新百川开源了一个可以和openai新模型掰手腕的医疗垂直大模型:Baichuan-M2在HealthBench基准上取值60.1的高分,超过了gpt-oss-120b。这次一起回顾下百川给的技术报告。 2. Baichuan-M2概览:“模型+系统” Baichuan-M2的成功源于一套精心设计的、端到端的训练与优…

OBOO鸥柏丨75寸/86平板企业办公会议触控一体机核心国产化品牌招投标参数

OBOO鸥柏整机参数要求&#xff1a;55寸/65寸/75寸/85-86寸/98寸/100寸/110寸/115寸智能会议平板教学触控一体机/智慧黑板触摸屏参数要求。系统可灵活选择如&#xff1a;支持安卓&#xff08;Android&#xff09;&#xff0c;Windows可选择。并在KylinOS银河麒麟操作系统、统信U…

DCT域信息隐藏中超参数影响的深度解析:从理论到实践的完整指南

摘要 随着数字媒体技术的飞速发展,信息隐藏技术在版权保护、内容认证和隐私保护等领域发挥着越来越重要的作用。离散余弦变换(DCT)域作为信息隐藏的经典载体,因其与JPEG压缩标准的天然兼容性而备受关注。然而,DCT域信息隐藏的效果很大程度上取决于各种超参数的精心调节,…

YOLOv8环境配置命令

【YOLOv8】一小时掌握&#xff0c;从0开始搭建部署YOLOv8系列教程&#xff0c;安装推理自定义数据集训练与搭建_哔哩哔哩_bilibili【YOLOv8】一小时掌握&#xff0c;从0开始搭建部署YOLOv8系列教程&#xff0c;安装推理自定义数据集训练与搭建共计10条视频&#xff0c;包括&…