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,一经查实,立即删除!

相关文章

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…

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

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

【超级详细】基于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控制器实现的…

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

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

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

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

Rancher的安装

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

文件上传和下载

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

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

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

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

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

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

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

适配器模式:类适配器与对象适配器

适配器模式是一种结构性设计模式,旨在将一个接口转换成客户端所期望的另一种接口。它通常用于解决由于接口不兼容而导致的类之间的通信问题。适配器模式主要有两种实现方式:类适配器和对象适配器。下面,我们将详细探讨这两种方式的优缺点及适…

语音识别:docker部署FunASR以及springboot集成funasr

内容摘选自: https://github.com/modelscope/FunASR/blob/main/runtime/docs/SDK_advanced_guide_offline_zh.md FunASR FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD&#xf…

oracle-函数-NULLIF (expr1, expr2)的妙用

【语法】NULLIF (expr1, expr2) 【功能】expr1和expr2相等返回NULL,不相等返回expr1经典的使用场景: 1. 数据清洗与转换 在数据清洗过程中,NULLIF 函数可以用于将某些特定值(通常是无效或不需要的值)替换为 NULL&…

【LLM】Agentic Workflow的四种常见思路

note Reflection 和 Tool Use 属于比较经典且相对已经广泛使用的方式,Planning 和 Multi-agent 属于比较新颖比较有前景的方式。 文章目录 note一、四种设计模式1. Reflection2. Tool use3. Planning4. Multi-agent collaboration 二、相关代码实践 一、四种设计模…

Python数据可视化seaborn

产品经理在做数据分析时可能需要通过可视化来分析。seaborn官网 1. relplot 散点图 https://seaborn.pydata.org/examples/scatterplot_sizes.html import pandas as pd import seaborn as sns df pd.DataFrame({x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],y: [8, 6, 7, 8, 4, 6,…

基于ssm的个人健康管理系统

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

CSS3新增渐变(线性渐变、径向渐变、重复渐变)

1.线性渐变 代码: 效果图: 使文字填充背景颜色: 效果图: 2.径向渐变 代码: 效果图: 代码图: 效果图: 3.重复渐变 代码: 效果图: