【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. 有些特殊场景需要释放,比如单例对象析构时,要进行一些持久化(往文件、数据库写)操作。

到此结束。。。

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

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

相关文章

农村农产品信息展示网站的设计与实现(论文+源码)_kaic

摘 要 随着软件技术的迅速发展,农产品信息展示的平台越来越多,传统的农产品显示方法将被计算机图形技术取代。这种网站技术主要把农产品的描述、农产品价格、农产品图片等内容,通过计算机网络的开发技术,在互联网上进行展示,然后通过计算机网…

Little Kernel代码学习笔记

目录 虚拟地址转换为物理地址内核启动Multiboot头部结构启动时的寄存器状态real_start段选择子初始化BSS段 页表转换设置CR4、CR3、EFER寄存器设置页表映射 初始化IDT,执行lk_main 虚拟地址转换为物理地址 // start.S#define PHYS_LOAD_ADDRESS (MEMBASE KERNEL_L…

多功能租车平台微信小程序源码 汽车租赁平台源码 摩托车租车平台源码 汽车租赁小程序源码

多功能租车平台微信小程序源码是一款用于汽车租赁的平台程序源码。它提供了丰富的功能,可以用于租赁各种类型的车辆,包括汽车和摩托车。 这个小程序源码可以帮助用户方便地租赁车辆。用户可以通过小程序浏览车辆列表,查看车辆的详细信息&…

npm 卸载 vuecli后还是存在

运行了npm uninstall vue-cli -g,之后是up to date in,然后vue -V,版本号一直都在,说明没有卸载掉 1、执行全局卸载命令 npm uninstall vue-cli -g 2、删除vue原始文件 查看文件位置,找到文件删掉 where vue 3、再…

[Go版]算法通关村第十三关黄金——数字数学问题之数论问题(最大公约数、素数、埃氏筛、丑数)

目录 题目:辗转相除法(求最大公约数)思路分析:辗转相除法(也叫欧几里得算法)gcd(a,b) gcd(b,a mod b)复杂度:时间复杂度 O ( n l o g ( m a x ) ) O(nlog(max)) O(nlog(max))、空间复杂度 O (…

探索pytest:Python自动化测试的新境界

在当今的软件开发领域,测试已经不仅仅是一个简单的步骤,而是确保软件质量的核心环节。Python,作为全球最受欢迎的编程语言之一,拥有丰富的测试框架和工具。而在这其中,pytest无疑是最受欢迎和最具影响力的一个。本文将…

ICS PA1

ICS PA1 init.shmake 编译加速ISA计算机是个状态机程序是个状态机准备第一个客户程序parse_argsinit_randinit_loginit_meminit_isa load_img剩余的初始化工作运行第一个客户程序调试:零断点TUI 基础设施单步执行打印寄存器状态扫描内存 表达式求值词法分析递归求值…

Go的基础运行方式和打包

目录 基础运行方式导入路径 打包技巧相关知识点 基础运行方式 // 文件名可以不是main,但包名和入口函数比如是main // main.go package main // 导入包的时候可以直接导入,也可以导入后指定包名, import ("fmt"godemo "githu…

Android学习之路(10) setContentView详解

一、简介 setContentView我们在Activity中经常见到,它的作用就是把我们的布局文件放在Activity中显示,下面我们根据源码分析setContentView是如何做到的 二、源码分析 1.两种setContentView 注意Activity的setContentView和AppCompatActivity的setCo…

斯坦福人生设计课——简略笔记

来源:⽐尔博内特 戴夫伊万斯 著图书《人生设计课》 目录 一、认清当下的情况,从四个维度观察自己的人生 二、平衡人生,但不要走入误区 2.1 记录你的“美好时光日志”: 2.1.1 记录内容: 2.1.2 辅助反思的方法&…

WebRTC音视频通话-iOS端调用ossrs直播拉流

WebRTC音视频通话-iOS端调用ossrs直播拉流 之前实现iOS端调用ossrs服务,文中提到了推流。没有写拉流流程,所以会用到文中的WebRTCClient。请详细查看:https://blog.csdn.net/gloryFlow/article/details/132262724 一、iOS播放端拉流效果 二…

强训第40天

选择 A 在域名解析之前,需要先与访问域名服务器,与域名服务器之间的网络通信需要涉及相邻设备之间的数据传输。也就是ARP,所以ARP是第一个 B C D 可靠传输的基础是确认应答以及超时重传。这俩是通过序号和确认序号交付的 A B 对用户是不透明的…

Rust之自动化测试(一):如何编写测试

开发环境 Windows 10Rust 1.71.1 VS Code 1.81.1 项目工程 这里继续沿用上次工程rust-demo 编写自动化测试 Edsger W. Dijkstra在他1972年的文章《谦逊的程序员》中说,“程序测试可以是一种非常有效的方法来显示错误的存在,但它对于显示它们的不存在…

架构评估-架构师之路(十二)

软件系统质量属性 软件系统质量熟悉分为 开发期质量属性 和 运行期质量属性。 质量属性 性能:指 系统的响应能力,如 响应时间,吞吐率。 设计策略:优先级队列、增加计算资源、减少计算开销、引入并发机制、采用资源调度。 可靠…

【ArcGIS Pro二次开发】(62):复制字段

应网友需求,做了这么一个复制字段的小工具。 假定这样一个场景,手头有一个要素1,要素里有10个字段,另一个要素2,除了shape_area等图形字段外,没有其它字段。 现在的需求是,想把要素1中的8个字…

【跨域异常】

想在前端使用vue获取后端接口的数据,但是报了跨域异常,如下图所示。 一种解决的方式是,在后端Controller接口上加上CrossOrigin,从后端解决跨域问题。 还要注意前端请求的url要加上协议,比如http://

vue使用vant中的popup层,在popup层中加搜索功能后,input框获取焦点 ios机型的软键盘不会将popup顶起来的问题

1.使用vant的popup弹出层做了一个piker的选择器,用户需要在此基础上增加筛选功能。也就是输入框 2.可是在ios机型中,input框在获取焦点以后,ios的软键盘弹起会遮盖住我们的popup层,导致体验不是很好 3.在大佬的解答及帮助下,采用窗口滚动的方式解决此方法 <Popupv-model&q…

数据结构--树4.2(二叉树)

目录 一、二叉树的定义和特点 1、定义 2、特点 二、二叉树的基本形态 1、空二叉树 2、只有一个根结点 3、根结点只有左子树 4、根结点只有右子树 5、根结点既有左子树又有右子树 6、斜树 7、满二叉树 8、满二叉树和完全二叉树 三、二叉树的性质 一、二叉树的定义和…

Element——table排序,上移下移功能。及按钮上一条下一条功能

需求&#xff1a;table排序&#xff0c;可操作排序上移下移功能。判断第一行上移禁用和最后一行下移禁用&#xff0c;排序根据后端返回的字段 <el-table:data"tableData"style"width: 100%"><el-table-column type"index" label"序…

JVM虚拟机:定位对象的两种方式

定位对象的方式 1、句柄池 2、直接指针 ‘句柄池 直接指针 在Java中&#xff0c;可以使用两种方式来定位对象&#xff1a;句柄池和直接指针。 1. 句柄池&#xff1a;在Java的句柄池模型中&#xff0c;Java虚拟机&#xff08;JVM&#xff09;会为每个对象创建一个句柄&#xff…