当前位置: 首页 > news >正文

初识c++:string类(2)

#本节主要讲解c++:string类的模拟实现

全部代码的实现在最后面!!!有需要的自己往下滑,自取!!!

1.string类的模拟实现

2.浅拷贝

3.深拷贝

目录

#本节主要讲解c++:string类的模拟实现

1.string类的模拟实现

2.浅拷贝

3.深拷贝


1.string类的模拟实现

现在我们将开始对string类的全方位刨析:

(1)构造函数,是肯定要写的,这里就不多提(如果不知道为什么,请看作者前几篇整理的博客,进行相关的了解),构造函数肯定是要创建一点的空间大小,利用new来创建容量。

我们可以很明显的看到下图构造函数给了一个缺省值,就是当什么都不给的时候,也就是单纯创建对象时,自动调用构造函数。

(当然在我们创建空间的时候,+1,是为了给'\0'一个空间的位置)

第二种呢是一种拷贝构造,就如下图注释一样的用法,(深拷贝在下面我将会进行讲解),首先呢我们需要创建容量,再利用strcpy将s1._str字符串传过去给s2。(拷贝构造是一个已经创建好的类,给另一个未初始化的类进行拷贝。)

(2)下图为赋值,用法如下图注释,由图可知,赋值是将一个对象的内容赋值给另一个已经创建好的对象。

首先我们不能自己给自己赋值,编译器会报错,所以在模拟实现的时候我们需要考虑这点,其次我们需要删除被赋值的内容和空间(利用delete),再创建和将要使用的对象对另一个对象赋值的对象一样大小的空间,利用strcpy拷贝过去。

(3)一个类有了构造当然也需要有析构啦,析构如下:(比较简单不过多讲解)

(4)由下图很明显iterator指代的是char*,再者begin获取一个字符的迭代器 ,end获取最后一个字符下一个位 置的迭代器

(5)push_back的作用是尾插,在尾插前我们肯定先得判断一下,空间是否足够,不够就需要利用reserve来进行扩容。并且+=运算符重载的函数也是尾插的作用,所以我们可以直接利用push_back来进行编写。

(6)clear的作用是清空有效字符,就如下图很简单。

(7)append的作用是在字符串后追加一个字符串,也是先进行容量的判断,再利用一个strcpy函数将str拷贝到_str的元素的末尾。而+=也如上述一样。(所以我们一般在结尾追加一个字符或者字符串用的比较多的是+=)

(8)下图insert函数是在pos前追加一个字符很显然需要移动pos及其后面元素的位置,将他们往后面移动。

下图是添加一个字符串在pos前面,需要我们进行画图分析,对于while循环里面的条件。(这里只有自己动手画图来分析一下,才能够更好的理解)

(9)substr函数的作用:在str中从pos位置开始,截取长度为len的字符,然后将其返回。

在这里我们创建了一个新的string对象来储存长度为len的字符,并且返回。

大概重要的函数本节讲了一些,难度不算很难,所以就讲了这些做个样例,需要代码可以从本节文章最后自取。

2.浅拷贝

浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致 多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该 资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。

3.深拷贝

如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给 出。一般情况都是按照深拷贝方式提供。

下面是代码的实现:

本节到此结束啦,如果对你的理解有帮助的话点赞加收藏哦,谢谢啦!!!

相关文章:

  • JavaScript(17)——事件监听
  • google 浏览器插件开发简单学习案例:TodoList;打包成crx离线包
  • 2024年钉钉杯大数据竞赛A题超详细解题思路+python代码手把手保姆级运行讲解视频+问题一代码分享
  • Vue3+Element Plus 实现table表格中input的验证
  • 堆的相关知识点
  • 【数据结构】二叉树链式结构——感受递归的暴力美学
  • 十大排序的稳定性和时间复杂度
  • 【proteus经典项目实战】51单片机用计数器中断实现100以内的按键计数并播放音乐
  • SAP MM学习笔记46 - 购买中的出力管理(消息管理)
  • IntelliJ IDEA 直接在软件中更新为最新版
  • 论文快过(图像配准|Coarse_LoFTR_TRT)|适用于移动端的LoFTR算法的改进分析 1060显卡上45fps
  • mysql1055报错解决方法
  • git报错403,git项目拉取不下来
  • VSCode | 修改编辑器注释的颜色
  • opencv grabCut前景后景分割去除背景
  • Java多态
  • python docx文档转html页面
  • ucore操作系统实验笔记 - 重新理解中断
  • 彻底搞懂浏览器Event-loop
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 从PHP迁移至Golang - 基础篇
  • 多线程事务回滚
  • 免费小说阅读小程序
  • 如何进阶一名有竞争力的程序员?
  • 用Visual Studio开发以太坊智能合约
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • AI算硅基生命吗,为什么?
  • postgresql行列转换函数
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​iOS安全加固方法及实现
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # 职场生活之道:善于团结
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #include到底该写在哪
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (南京观海微电子)——I3C协议介绍
  • (篇九)MySQL常用内置函数
  • (三)c52学习之旅-点亮LED灯
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十五)使用Nexus创建Maven私服
  • (源码分析)springsecurity认证授权
  • (转)Linq学习笔记
  • (转)一些感悟
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .Net 8.0 新的变化
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强
  • .net中调用windows performance记录性能信息
  • .so文件(linux系统)
  • /proc/stat文件详解(翻译)