【C++】特殊类的设计

特殊类的设计

  • 前言
  • 正式开始
    • 设计一个类,不能被拷贝
    • 设计一个类,只能在堆上创建对象
    • 设计一个类,只能在栈上创建对象
    • 设计一个类,不能被继承
    • 设计一个类,只能创建一个对象(单例模式)
      • 饿汉模式
      • 懒汉模式
      • 总结

在这里插入图片描述

前言

点进来的同学可能不知道本篇讲的是啥,先提前看看:

  1. 请设计一个类,不能被拷贝
  2. 请设计一个类,只能在堆上创建对象
  3. 请设计一个类,只能在栈上创建对象
  4. 请设计一个类,不能被继承
  5. 请设计一个类,只能创建一个对象(单例模式)

这下子就知道了吧,不过看本篇之前先想想:上面的5个类你都会搞不?

正式开始

就按照上面的内容挨个讲。

一般创建对象就下面三种:

ClassName cn1; // 栈
static ClassName cn2; // 静态区
ClassName* cn3 = new ClassName; // 堆

设计一个类,不能被拷贝

这个很简单,我上篇的博客中也有。

C++98:
让拷贝构造和拷贝赋值只声明不实现,并设置为私有。
在这里插入图片描述
只声明的话,链接会报错。
私有是为了防止有人直接在类外实现。

C++11:
让拷贝构造和拷贝赋值后面跟上 = delete。
在这里插入图片描述

对这个关键字不熟悉的同学点传送门:【C++】C++11中比较重要的内容介绍。其中就有delete关键字的介绍。

设计一个类,只能在堆上创建对象

三种方法。

法一:析构设置为私有

在这里插入图片描述
对象生命周期结束后会自动调用析构。但是这里把析构私有了就不行了。
在这里插入图片描述
堆上new的话,可以创建,但是这里有一个问题,就是内存泄漏了,因为没有delete hp,就没有调用对应的析构,这样的话如果类中有成员是在堆上的,就会导致内存泄漏。解决办法就是再改一个共有的函数用来实现析构功能:
在这里插入图片描述
这样就不会导致内存泄漏了:
在这里插入图片描述

法二:构造设置为私有

这个方法也是需要搞一个公有的接口来专门返回一个堆上开辟的空间:

在这里插入图片描述
但是要搞成static的,不然没法创建对象,就不能调用成员函数:
在这里插入图片描述
在这里插入图片描述
但是同时需要把拷构禁掉,不然还能这样用:
在这里插入图片描述
这样生成的copy是在栈上的。
所以要禁掉拷构:
在这里插入图片描述
在这里插入图片描述
这样就好了。

delete析构
这个方法已经在刚刚的传送门那篇里讲过了,这里就不再说了,直接点传送门:【C++】C++11中比较重要的内容介绍。

设计一个类,只能在栈上创建对象

这个要将构造函数设置为私有,然后再搞一个返回对象的接口:
在这里插入图片描述
上面注释的方式也可以。

也是要搞成stack的,不然也是调不了:
在这里插入图片描述

而且这里不能将拷构delete掉,因为Create的返回值为传值返回对象,delete掉的话就会导致没法返回了。

但是这样的话就出问题了,static和堆都可以创建对象了:
在这里插入图片描述

我们可以重载一下new,直接搞成delete的,这样new就不能用了:
在这里插入图片描述
看:
在这里插入图片描述

但是这里没办法不让static创建对象,算是一个小缺陷,但是平时一般也不会搞一个static的对象。
在这里插入图片描述

设计一个类,不能被继承

C++98:
构造函数私有,这样子类创建对象的时候,调用子类的构造函数会先调用父类的构造函数,父类的构造函数调用不了子类就没法创建对象,没法创建对象的类也就没啥意义了。

C++11:
在父类后面加上final关键字。

这个在我前面继承的博客中有,详细的就不讲了,传送门:【C++】继承知识点详解。

不懂得同学点传送门去看看。

设计一个类,只能创建一个对象(单例模式)

上面的四个类,现实中没有太大的意义,只是为了考一下各位的思维和对基础知识的掌握程度。

但是这个类就很有用了。

单例模式,就是只能创建唯一实例对象。也就是说这个类只能创建出一个对象。

分两种模式,一个叫饿汉模式,一个叫懒汉模式。分开讲。

饿汉模式

意思就是main函数执行之前就创建对象。

怎么搞呢?

首先就是构造函数私有化,不然能一直创建对象。

然后再类内直接定义类对象。而且必须是static的。看:
在这里插入图片描述

或者是指针:
在这里插入图片描述

_inst / _pinst 是类的成员,可以调用私有的构造函数,但是static必须要在类外初始化。

在这里插入图片描述

在这里插入图片描述

下面的就不用_inst了,直接用_pinst。

搞一个得到_pinst的接口:
在这里插入图片描述

内存池就要用到这里的单例模式,假如说内存池要搞空间的话,给一个接口:

在这里插入图片描述

再来个释放空间的:
在这里插入图片描述

等等功能,就不写了,这里主要见一下猪跑,知道饿汉模式是啥就行了。

再看一下用法:
在这里插入图片描述
不细讲了。

说一下饿汉模式的优缺点。

优点
简单,没有线程安全问题(前面的博客中没有将线程,之后我写了线程的博客之后再说)。

缺点:

  1. 一个程序中,多个单例,并且有先后创建初始化顺序要求时,饿汉无法控制。
    比如程序两个单例类A 和 B,假设要求A先创建初始化,B再创建初始化。
  2. 饿汉单例类,初始化时任务多,会影响程序启动速度。

懒汉模式

懒汉模式是适用对象的时候再创建实例对象。

除了初始化,其他的基本差不多。

我就直接以内存池命名了:
在这里插入图片描述

还可以搞的看起来高大上一点:

在这里插入图片描述

这就是懒汉模式。其优点就是饿汉的缺点,缺点就是饿汉的优点。
优点:
1、控制顺序。
2、不影响启动速度。

缺点:
1、相对复杂。(线程安全问题没讲)
2、线程安全问题要处理好

总结

说一下饿汉和懒汉在现实中的例子:
想想一下各位小时候写暑假作业是啥样的。放假之前学校已把暑假作业发下去了。

肯定有同学趁老师没有收答案前就抓紧时间对着后面的答案一节课干一本,这就是饿汉模式,就是暑假正式开始之前就把作业啃完了。啃完了之后暑假就往死里玩了,啥也不用管。

当然肯定有同学一点都不想写,然后暑假一直在玩,直到最后两三天了,就整天抱着别人写好的作业抄,抄一本是一本,从早上八点干到晚上十点,甚至有时候作业多了还通宵接着干。这就是懒汉模式,等到暑假结束得交作业了才写。

单例对象释放问题:

  1. 一般情况下,单例对象不需要释放的。因为一般整个程序运行期间都可能会用它。
    单例对象在进程正常结束后,也会资源释放。
  2. 有些特殊场景需要释放,比如单例对象析构时,要进行一些持久化(往文件、数据库写)操作。

到此结束。。。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三次握手四次挥手之全连接半连接队列

什么是全连接半连接 在 TCP 三次握手的时候,Linux 内核会维护两个队列,分别是: 半连接队列,也称 Listen 队列;全连接队列,也称 accept 队列; 工作原理 每一个socket执行listen时&#xff0c…

BIO到NIO、多路复用器, 从理论到实践, 结合实际案例对比各自效率与特点(下)

文章目录 多路复用器简介多路复用器的两个阶段Java中的多路复用器封装测试代码压测结果总结 本篇文章是BIO到NIO、多路复用器, 从理论到实践, 结合实际案例对比各自效率与特点(上)的下一篇, 如果没有看的小伙伴, 可以先看下, 不然可能会不连贯. 多路复用器简介 多路复用器是对…

【QT】重写QAbstractLIstModel,使用ListView来显示多列数据

qt提供了几个视图来进行信息的列表显示,QListView可以用来显示继承QStractListModel的字符串列表中的字符串,默认的模型里面只包含一列的内容: 这里以qml为例子,先新建一个qml的项目,示例代码如下: 先创建一…

【提升接口响应能力的最佳实践】常规操作篇

文章目录 1. 并行处理简要说明CompletableFuture是银弹吗?测试案例测试结论半异步,半同步总结 2. 最小化事务范围简要说明编程式事务模板 3. 缓存简要说明 4. 合理使用线程池简要说明使用场景线程池的创建参数的配置建议 线程池的监控线程池的资源隔离 5…

idea的debug断点的使用

添加断点(目前不知道如何添加断点,就给AutoConfigurationImportSelector的每个方法都加上断点): 然后将StockApplication启动类以debug方式运行,然后程序就会停在119行 点击上边的step over让程序往下运行一行&#x…

HLS实现CORDIC算法计算正余弦并上板验证

硬件:ZYNQ7010 软件:MATLAB 2019b、Vivado 2017.4、HLS 2017.4、System Generator 2017.4 1、CORDIC算法计算正余弦 CORDIC算法详细分析网上有很多资料,它的原理是用一系列旋转去逼近目标角度,这一系列旋转的角度为 θ a r c t…

Git gui教程---第七篇 Git gui的使用 返回上一次提交

1. 查看历史,打开gitk程序 2. 选中需要返回的版本,右键,然后点击Rest master branch to here 3.出现弹窗 每个选项我们都试一下,从Hard开始 返回的选项 HardMixedSoft Hard 会丢失所有的修改【此处的…

【Jellyfin影音服务器】 本地部署公网远程影音库

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…

dig批量域名逆向查询ip

dig批量域名逆向查询ip dig nocmd noall answer -f iplist.txtiplist.txt中内容 效果图: dig其他选项参数: dig www.baidu.com A # 查询A记录,如果域名后面不加任何参数,默认查询A记录 dig www.baidu.com MX # 查询MX记…

重新认识Android中的线程

线程的几种创建方式 new Thread:可复写Thread#run方法。也可以传递Runnable对象,更加灵活。缺点:缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统的资源导致死机或oom。 new Thread(new…

LeetCode-406-根据身高重建队列

题目描述: 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造…

VB.NET调用VB6 Activex EXE实现PowerBasic和FreeBasic的标准DLL调用

VB6写的ActiveX EXE公共对象是外置进程,因此,尽管它是x86 32位的进程,但可以集成到 VB.NET的x64和x32程序中使用。 VS2022的VB.NET程序,调用ActiveX DLL对象我在上篇笔记中写了 VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeB…

Git向远程仓库与推送以及拉取远程仓库

理解分布式版本控制系统 1.中央服务器 我们⽬前所说的所有内容(⼯作区,暂存区,版本库等等),都是在本地也就是在你的笔记本或者计算机上。⽽我们的 Git 其实是分布式版本控制系统!什么意思呢? 那我们多人…

计算机网络(10) --- 高级IO

计算机网络(9) --- 数据链路层与MAC帧_哈里沃克的博客-CSDN博客数据链路层与MAC帧https://blog.csdn.net/m0_63488627/article/details/132178583?spm1001.2014.3001.5501 目录 1.IO介绍 1.IO本质 2.IO模型 2.非阻塞 3.IO多路转接 1.select 编写…

电阻器件的分类

电阻器的种类碳膜电阻膜式电阻器中的一种。气态碳氢化合物在高温和真空中分解,碳沉积在瓷棒或者瓷管上,形成一层结晶碳膜。改变碳膜厚度和用刻槽的方式变更碳膜的长度可以得到不同的阻值。碳膜电阻成本较低,电性能和稳定性较差,一…

Python自动化小技巧21——实现PDF转word功能(程序制作)

案例背景 为什么这个年代PDF转word,某wps居然还要收费.....很多软件都可以实现这个功能,但是效果都有好有坏,而且有的还付费,很麻烦。 那就用python实现这个功能吧,然后把代码打包为.exe的程序,这样随便在…

企业网络日志安全与 EventLog Analyzer

企业的网络日志安全是一项至关重要的任务。随着信息技术的迅猛发展,网络攻击和数据泄露的威胁也与日俱增。为了应对这些威胁,企业需要强大的工具来监控、分析和保护其网络日志。而ManageEngine的EventLog Analyzer正是这样一款卓越的解决方案。 网络日志…

Sentinel 控制台(集群流控管理)

规则配置 要通过 Sentinel 控制台配置集群流控规则&#xff0c;需要对控制台进行改造。我们提供了相应的接口进行适配。 从 Sentinel 1.4.0 开始&#xff0c;我们抽取出了接口用于向远程配置中心推送规则以及拉取规则&#xff1a; DynamicRuleProvider<T>: 拉取规则Dy…

网站和API支持HTTPS,最好在Nginx上配置

随着我们网站用户的增多&#xff0c;我们会逐渐意识到HTTPS加密的重要性。在不修改现有代码的情况下&#xff0c;要从HTTP升级到HTTPS&#xff0c;让Nginx支持HTTPS是个很好的选择。今天我们来讲下如何从Nginx入手&#xff0c;从HTTP升级到HTTPS&#xff0c;同时支持静态网站和…

Spark Standalone环境搭建及测试

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 篇一&#xff1a;Linux系统下配置java环境 篇二&#xff1a;hadoop伪分布式搭建&#xff08;超详细&#xff09; 篇三&#xff1a;hadoop完全分布式集群搭建&#xff08;超详细&#xf…