初识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.深拷贝

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

下面是代码的实现:

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

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

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

相关文章

VIsual Studio:为同一解决方案下多个项目分别指定不同的编译器

一、引言 如上图,我有一个解决方案【EtchDevice】,他包含两个(甚至更多个)子项目,分别是【DeviceRT】和【DeviceWin】,见名知意,我需要一个项目编译运行在RTOS上,譬如一个名叫INTime…

用重建大师进行空三解算时,引擎出现“不能访问目录或文件”怎么解决?

答:之前的工程还有在做的任务,可以更换任务目录重新提交空三试试。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件,输入倾斜照片,激光点云,POS信息及像控点,输出高精度彩色网格模型…

数据中心服务器搬迁团队

数据中心机房服务器搬迁,需要专业的数据中心机房服务器提供技术保障服务。友力科技(广州)有限公司,作为华南地区主流的数据中心服务商,专业从事数据中心机房搬迁服务。 数据中心机房搬迁涉及设备数量多、系统复杂&…

数据结构: 链表回文结构/分割链表题解

目录 1.链表的回文结构 分析 代码 2.链表分割 ​编辑分析 代码 1.链表的回文结构 分析 这道题的难点是空间复杂度为O(1) 结合逆置链表找到链表的中间节点就可以解决了。 先找到链表的中间节点,再对中间节点的下一个节点进行逆置&…

什么是大型语言模型 (LLM)

本章探讨下,人工智能如何彻底改变我们理解和与语言互动的方式 大型语言模型 (LLM) 代表了人工智能的突破,它采用具有广泛参数的神经网络技术进行高级语言处理。 本文探讨了 LLM 的演变、架构、应用和挑战,重点关注其在自然语言处理 (NLP) 领…

三、建造者模式

文章目录 1 基本介绍2 案例2.1 Car 类2.2 CarBuilder 抽象类2.3 EconomyCarBuilder 类2.4 LuxuryCarBuilder 类2.5 CarDirector 类2.6 测试程序2.7 测试结果2.8 总结 3 各角色之间的关系3.1 角色3.1.1 Product ( 产品 )3.1.2 Builder ( 抽象建造者 )3.1.3 ConcreteBuilder ( 具…

SvelteKit - 1. 初始化项目

官方 doc - create a project 1、基本环境 (下面是我这里的环境,亲测用 node 14 和 16 install 会报错) node:20.9.0 npm:10.1.0 2、初始化项目 npm create sveltelatest my-app cd my-app npm install npm run de…

批量打断相交线——ArcGIS 解决方法

在数据处理,特别是地理空间数据处理或是任何涉及图形和线条分析的场景中,有时候需要把相交的线全部从交点打断一个常见的需求。这个过程对于后续的分析、编辑、或是可视化展现都至关重要,因为它可以确保每条线都是独立的,避免了因…

Vue Router基础

Router 的作用是在单页应用(SPA)中将浏览器的URL和用户看到的内容绑定起来。当用户在浏览不同页面时,URL会随之更新,但页面不需要从服务器重新加载。 1 Router 基础 RouterView RouterView 用于渲染当前URL路径对应的路由组件。…

pytest的安装和介绍和 Exit Code 含义

pytest 准备工作(在cmd里): 1安装 pip install -U pytest2验证安装 pytest --version # 会展示当前已安装版本3其他的 显示可用的内置函数参数 pytest --fixtures通过命令行查看帮助信息及配置文件选项 pytest --help一、pytets框架中的…

【DVWA靶场】Web安全之(布尔值/延时型)SQL盲注(超详细教程)

SQL盲注原理 1.SQL盲注概念 SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示页面上获取执行结果,甚至连注入语句是否执行都无从得知,因此盲注的难度要比一般注入高。目…

【数据结构】AVL树(平衡二叉搜索树)

文章目录 1.AVL树1.1 AVL树的概念1.2 AVL树节点的定义1.3 AVL树的插入1.4 AVL树的旋转1.4.1 左单旋1.4.2 右单旋1.4.3 右左双旋1.4.4 左右双旋 1.5 AVL树的平衡验证1.6 AVL树的删除1.7 AVL树的性能 1.AVL树 在前面,我们已经介绍过了二叉搜索树,也了解到…

美摄科技企业级视频拍摄与编辑SDK解决方案

在数字化浪潮汹涌的今天,视频已成为企业传递信息、塑造品牌、连接用户不可或缺的强大媒介。为了帮助企业轻松驾驭这一视觉盛宴的制作过程,美摄科技凭借其在影视级非编技术领域的深厚积累,推出了面向企业的专业视频拍摄与编辑SDK解决方案&…

Mac安装Hoomebrew与升级Python版本

参考 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 安装了Python 3.x版本,你可以使用以下命令来设置默认的Python版本: # 首先找到新安…

THS配置keepalive(yjm)

启动完THS管理控制台和THS后,登录控制台,进入实例管理》节点管理,可以分别使用界面配置和编辑配置设置长连接。 1、界面配置 点击界面配置》集群设置,启用长连接,设置长连接数、最大请求数和超时时间。 2、编辑配置 …

项目的纪要

ai客服项目中发现的问题: 可以在控制台看到我们存储的cookie: 可以看到是这样的, 但是我们通过getCookie方法专门获取这个字段, 然后在控制台打印后 const userName getTheCookie(SA_USER_NICK_NAME); console.log(userName, userName); 输出结果是: 然后我们尝试通过…

JMeter的使用方法及https的使用方法

软件安装: 参考链接:JMeter 下载安装及环境配置(包含jdk1.8安装及配置)_jmeter5.2.1需要什么版本的jdk-CSDN博客 前置知识储备: Https请求的案例: JMeter的第一个案例 增加线程数 线程(thread&#xff…

Meta 发布 LLAMA 3.1;特斯拉无人出租车推迟至 10 月;谷歌将向 Waymo 再投 50 亿美元

先瞧一下 Chat 和 Agent 的差异。 Chat(聊天):纯粹的 Chat,宛如一个主要由“大脑与嘴”组成的智能体,着重于信息处置和语言沟通。诸如 ChatGPT 这般的系统,其能够领会用户的询问,给出有益且连贯…

Linux:基础命令学习

目录 一、ls命令 实例:-l以长格式显示文件和目录信息 实例:-F根据文件类型在列出的文件名称后加一符号 实例: -R 递归显示目录中的所有文件和子目录。 实例: 组合使用 Home目录和工作目录 二、目录修改和查看命令 三、mkd…

《Java初阶数据结构》----4.<线性表---Stack栈和Queue队列>

前言 大家好,我目前在学习java。之前也学了一段时间,但是没有发布博客。时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…