string模拟实现构造+析构

个人主页:Jason_from_China-CSDN博客

所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客

所属栏目:C++知识点的补充_Jason_from_China的博客-CSDN博客

string模拟实现构造 

方案1(初始化列表的实现):

这一种方案是一种不完整方案,是不合适的方案,我是用来对比讲解使用的,所以可以看,可以不看,这里实现的无参数构造

//.h头文件
using namespace std;//突破域名
//这里我们采取namespace封装一下
namespace Test
{class string{public://构造函数string();string(const char* str);private://这里本质上就是字符串的增删查改,所以和数据结构是有点像的char* _str;size_t _size;size_t _capacity;};
}

初始化列表格式进行初始化:
  1. 其实对于构造函数我们之前学过初始化列表和函数体的两种方式,所以我们到底在实际操作的时候,使用哪一种方式?这里采取初始化列表讲解,分析利弊。
  2. 初始化列表进行初始化,带参数构造的使用会存在一点问题,就是,我们需要先计算出字符串长度,然后才能开辟空间
  3. 初始化列表的构造,是按照私有成员变量的顺序进行初始化的,所以在后期代码维护,你的代码别人不注意就会很容易更改从而导致错误


初始化列表两种方式的代码:
  1. 不带参数

    这里创建是有一点小心机的,这里我们是_str(new char[]({'\0})->数组的形式创建空间,这里其实我们完全可以_str(new char{'\0}->不是数组形式创建空间,但是我们析构的时候,总不能再因为这个写两个析构函数吧,所以我这里直接就是使用创建多个空间的逻辑创建空间,也就是数组的形式创建空间
  2. 带参数


 

方案2(函数体和初始化列表的综合实现):

  1. 上面我们已经发现,纯粹采取初始化列表是可以实现的,但是是存在一些问题的,也就是我们需要改变私有变量的顺序
  2. 初始化列表的构造,是按照私有成员变量的顺序进行初始化的,所以在后期代码维护,你的代码别人不注意就会很容易更改从而导致错误
  3. 所以我们可以采取更加符合常规的一种写法

这里解释一下namespace,命名空间不仅可以单独给,还可以直接大规模的给,这样我们就可以不用在string.cpp实现的文件里面每次实现接口都需要 Test::string::接口。

//.h头文件
using namespace std;//突破域名
//这里我们采取namespace封装一下
namespace Test
{class string{public://构造函数string(const char* str="");private://这里本质上就是字符串的增删查改,所以和数据结构是有点像的char* _str;size_t _size;size_t _capacity;};
}
//实现文件
#include"string.h"
namespace Test
{//构造函数(传参)string::string(const char* str):_size(strlen(str)){_capacity = _size;_str = new char[_size + 1];strcpy(_str, str);//   目的地,来源}
}

代码的解释:

  1. 在头文件我们可以看见,string(const char* str="");,这里我们是不需要string(const char* str="\0");因为本身创建空间的时候就是会自带/0,没有必要继续加上/0
  2. 在实现上面,我们创建空间需要多创建一个空间,因为我们strlen是不计算\0的,所以我们需要_str = new char[_size + 1];从而在开辟空间的时候,多创建一个空间
  3. 最后我们只需要把字符拷贝到开辟好的空间,最后就可以
  4. 我们的测试我们会在实现析构之后一起进行测试,这里就不单独测试了

注意事项:

  1. 之前我们说过,在vs编译器下,cpp编译下,一些C语言的语法结构是需要写一行代码的,不然会导致报错
  2. #define  _CRT_SECURE_NO_WARNINGS 1//这一行代码,这是编译器的行为,编译器也会提醒你加上,这里我说明一下,不是语法结构的问题,是编译器认为这里有危险,加上这一行强制使用就可以。

string模拟实现析构

析构函数的实现是比较简单的,这里只需要直接析构就可以,因为我们创建空间的时候我们都是采取数组的形式创建的空间,所以我们析构的时候,我们直接数组的形式析构就可以

//头文件
#define  _CRT_SECURE_NO_WARNINGS 1
#pragma once
using namespace std;//突破域名
//这里我们采取namespace封装一下
namespace Test
{class string{public://构造函数string(const char* str="");//析构函数~string();private://这里本质上就是字符串的增删查改,所以和数据结构是有点像的char* _str;size_t _size;size_t _capacity;};
}
//实现文件
#include"string.h"namespace Test
{构造函数(不传参)//string::string()//	:_str(new char[1] {'\0'})//	, _size(0)//	, _capacity(0)//{}// _size指的是实际的个数// _capacity指的是空间,空间的使用//构造函数(传参)string::string(const char* str):_size(strlen(str)){_capacity = _size;_str = new char[_size + 1];strcpy(_str, str);//   目的地,来源}//析构函数string::~string(){delete[] _str;_str = nullptr;_size = 0;_capacity = 0;}
}

代码讲解:

  1. 首先我们析构_str字符串,这里我们采取析构数组的方式进行析构
  2. 让字符串指向空,C++的空和C语言的空是不一样的
  3. 最后把_size,_capacity,都归0
  4. 比较简单,这里不做过多赘述,这里的核心是提高测试调试的使用能力

代码测试:

  1. 在构造函数里面我们没有测试,因为一方面我们知道我们写的代码很简单不会报错,一方面我们的析构函数没有实现,其实不实现也可以测试,只是作者有点懒,想起来需要测试的时候,已经写到这里了。
  2. 构造函数的测试
  3. 析构函数的测试

注意事项:

  1. 下面我们讲解代码的时候,除非头文件有缺省参数参数,上代码的时候,我会只是实现这个函数接口的实现,但是需要头文件的时候,我会进行讲解这个头文件

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

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

相关文章

【java】实战-力扣题库:移除元素

问题描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作&#x…

【LeetCode】【算法】416. 分割等和子集

LeetCode 416. 分割等和子集 题目描述 给你一个 只包含正整数的非空数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 思路 和LeetCode 494.目标和很相似,这道题也是用动态数组可以求解的。 对nums的所有元素求个…

yolov8涨点系列之Concat模块改进

文章目录 Concat模块修改步骤(1) BiFPN_Concat3模块编辑(2)在__init_.pyconv.py中声明(3)在task.py中声明yolov8引入BiFPN_Concat3模块yolov8.yamlyolov8.yaml引入C2f_up模块 在YOLOv8中, concat模块主要用于将多个特征图连接在一起。其具体…

基于Spring Boot和Vue的电子商城系统功能设计

基于Spring Boot和Vue的电子商城系统功能设计 该系统是一个基于Spring Boot和Vue框架的电子商城平台,包含前台商城和后台管理系统。系统功能设计包括用户购物体验和管理员管理功能,支持商品的分类展示、收藏、购物车和订单管理等模块。以下是系统功能的简…

【课程总结】day34:多模态大模型之ViT模型、CLIP模型论文阅读理解

前言 在【课程总结】day31:多模态大模型初步了解一文中,我们对多模态大模型的基本原理有了初步了解,本章内容将通过论文阅读理解,更进一步理解多模态大模型中所涉及的 Vit 架构、Transformer在视觉应用的理念以及 Clip图像与文本…

实现数传数据转网口(以太网)和遥控器SBUS信号转串口的功能

为了帮助你实现数传数据转网口(以太网)和SBUS信号转串口的功能,这里提供一个基本的框架。我们将使用STM32微控制器来完成这些任务。假设你已经具备了STM32的基本开发经验,并且已经安装了相应的开发环境(如STM32CubeIDE…

Harmony OS 如何实现 C++ NATIVE YUV420(其他数据格式如BGRA等)自渲染

在HarmonyOS下自渲染视频数据 在本文中,我们将介绍如何在HarmonyOS下自渲染视频数据。我们将实现包括创建本地窗口、设置缓冲区选项、请求缓冲区、处理视频帧数据以及刷新缓冲区等步骤。 环境准备 在开始之前,请确保您已经安装了HarmonyOS的开发环境&…

【大数据学习 | kafka高级部分】kafka的快速读写

1. 追加写 根据以上的部分我们发现存储的方式比较有规划是对于后续查询非常便捷的,但是这样存储是不是会更加消耗存储性能呢? 其实kafka的数据存储是追加形式的,也就是数据在存储到文件中的时候是以追加方式拼接到文件末尾的,这…

计算机网络易混淆知识点串记

文章目录 计算机网络易混淆知识点串记各层PDU首部: 计算机网络易混淆知识点串记 各层PDU首部: PUD首部长度 (B:字节)首部单位数据链路–帧帧首:14B帧尾部:4B——IPV420~60字节4B [通过4位二进制表示]IPV6固定首部40字节[可拓展]4BTCP20~60字节4BUDP8B字节

【超级详细】基于Zynq FPGA对雷龙SD NAND的测试

目录 一、SD NAND特征1.1 SD卡简介1.2 SD卡Block图 二、SD卡样片三、Zynq测试平台搭建3.1 测试流程3.2 SOC搭建 一、SD NAND特征 1.1 SD卡简介 雷龙的SD NAND有很多型号,在测试中使用的是CSNP4GCR01-AMW与CSNP32GCR01-AOW。芯片是基于NAND FLASH和 SD控制器实现的…

mAP的定义

在目标检测任务中,mAP(mean Average Precision,平均精度均值)是一个常用的评估指标,用于衡量模型对多类别目标检测的整体性能。它结合了精度(Precision)和召回率(Recall)…

[357]基于springboot的中小型制造企业质量管理系统

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…

数据结构:跳表实现(C++)

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言跳表跳表的优化思路skiplist,平衡搜索树,哈希表的对比 实现思路SkiplistNodesearch 搜索add 增加earse 删除 整体…

哈希与unordered_set、unordered_map(C++)

目录 1. unordered系列关联式容器 1.1.unordered_map的接口示例 1.2. 底层结构 底层差异 哈希概念 2.哈希表的模拟实现 3.unordered的封装 3.1.哈希表的改造 3.2.上层封装 3.2.1.unordered_set封装 3.2.2.unordered_map封装及operator[]实现 1. unordered系列关联式…

Rancher的安装

1. 概览 1.1 用户界面优势 Rancher 提供了一个直观的图形用户界面(GUI)。对于不熟悉 Kubernetes 复杂的命令行操作(如使用kubectl)的用户来说,通过 Rancher 的界面可以方便地进行资源管理。例如,用户可以在…

文件上传和下载

目录 一、准备工作 二、文件上传 三、文件下载 一、准备工作 如果想使用Spring的文件上传功能,则需要再上下文中配置MultipartResolver前端表单要求:为了能上传文件,必须将表单的method设置为post,并将enctype设置为multipart…

ASPICE框架下的高效汽车软件开发实践与优化策略

ASPICE(Automotive SPICE)是汽车软件过程改进及能力评定的简称,它是汽车行业中用于保证软件质量的规范,要求供应商按照ASPICE的要求进行产品的设计与开发。 ASPICE软件开发流程是一个复杂且系统化的过程,以下是对ASPI…

Docker 镜像拉不动?自建 Docker Hub 加速站 解决镜像拉取失败

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 众所周知,6 月份的时候,Docker Hub 的镜像就已经无法正常拉取,那会随手用 Nginx 反代了一下 Docker Hub,建了个自用的镜像站,一直用到了 9 月份&…

真·香!深度体验 zCloud 数据库云管平台 -- DBA日常管理篇

点击蓝字 关注我们 zCloud 作为一款业界领先的数据库云管平台,通过云化自治的部署能力、智能巡检和诊断能力、知识即代码的沉淀能力,为DBA的日常管理工作带来了革新式的简化与优化。经过一周的深度体验,今天笔者与您深入探讨 zCloud 在数据库…

Qt的程序如何打包详细教学

生成Release版的程序 在打包Qt程序时,我们需要将发布程序需要切换为Release版本(Debug为调试版本),编译器会对生成的Release版可执行程序进行优化,使生成的可执行程序会更小。 debug版本 debug版本是一种开发过程中的…