c++参考std::string自己设计类hstring

目录

一、前言

二、设计需求

三、设计思想

1.功能一

1.功能二

四、设计过程

1.类hstring搭建

2. 实现有参构造函数

3. 实现副本构造函数

4.完整代码

五、结束语


一、前言

        在c++中有很多的库,但是在有些时候呢,我们一定要学会自己去设计库,不要老用别人的东西,比方说这个东西方便吗?特别方便。但是这个东西呢,有很大的副作用。

        再比方说一些特种项目,你比方说木马病毒啊,然后外挂等等,这种工程里你如果用这样的std::string去做的话,那么它带来的后果是很恶劣的,很可怕的,在这种情况下我怎么做呢?我一般推荐大家是我自己去写一个轻量级的这种字符串类型的库,所以今天我们不学其他的知识点,主要是自己设计一个简单的库。

二、设计需求

        我们要设计的项目设计需求比较简单,主要实现简单的功能即可,具体项目功能设计如图:

三、设计思想

        我们要设计一个类hsting,就参考这个std::string设计,我们主要不多做,不贪心,我们主要做两个功能。

1.功能一

        第一个功能是实现 hstring str("你好!"); 它是一个构造函数,其中传递了一个const char* 类型的字符串 "你好!" 。所以根据分析,我们类hstring中要有一个私有成员变量为char* 类型的成员变量m_str用来展现字符串。

        但是我们的m_str赋值操作不能够直接进行赋值,比如:

m_str = str; // str 为形参const char* str

 这种写法会直接报错显示:不能将"const char *"类型的值分配到"char *"类型的实体。

        所以我们要为m_str申请一块动态的内存空间,空间大小为传递来的r的大小。这里需要在hstring中添加一个成员变量unsigned short len表示str的字节大小。同时需要设计函数getLen()获取str的字节大小。

1.功能二

        功能二为hstring strA(str) // 副本构造函数,参数为创造声明的示例str,功能二实现与功能一内容思想基本相似,同时需要注意这里同样也不能够直接赋值:

       这是因为m_str为char*类型的指针,存储的是地址。如果直接赋值会导致实例str与strA中的成员变量m_str存储相同的地址,在析构函数中会重复析构两次,导致程序崩溃!

 代码和结果展示:

    // 打印地址printf("%p\n", str.getStr());printf("%p\n", strA.getStr());

四、设计过程

1.类hstring搭建

        前期类hstring搭建比较简单,主要是添加简单的成员变量和构造函数初始化功能。

class hstring
{
public:// 成员变量初始化hstring(){m_str = new char[1]{0};len = 0;}  // 获取lenunsigned short getLen() const{return len;}// 获取 m_strchar* getStr() const{return m_str;}// 析构函数:释放内存~hstring(){delete[] m_str;}private:char* m_str;unsigned short len;
};
2. 实现有参构造函数

        主要实现步骤为:

1. 设计获取char字节长度的函数返回值为len

2.为m_str动态申请内存空间,长度为len

3.用c语言中的memcpy功能库,进行内存拷贝操作

代码如下:

// 有参构造函数hstring(const char* str) {len = getLen(str);m_str = new char[len];memcpy(m_str, str, len);}// 获取形参的字节长度unsigned short getLen(const char* hstring){while (hstring[this->len++]);return len;}
3. 实现副本构造函数

        与有参构造结构相似

    // 副本构造函数hstring(const hstring& hstr){//m_str = hstr.m_str; !!! 错误写法len = getLen(hstr.getStr());m_str = new char[len];memcpy(m_str, hstr.getStr(), len);}// 第二种写法//hstring(const hstring& T): hstring(T.getStr()) {}
4.完整代码
#include <iostream>class hstring
{
private:char* m_str;unsigned short len; // 存储字节大小
public:// 成员变量初始化hstring(){m_str = new char[1]{0};len = 0;}// 有参构造函数hstring(const char* str) {len = getLen(str);m_str = new char[len];memcpy(m_str, str, len);}// 副本构造函数hstring(const hstring& hstr){//m_str = hstr.m_str; !!! 错误写法len = getLen(hstr.getStr());m_str = new char[len];memcpy(m_str, hstr.getStr(), len);}// 第二种写法//hstring(const hstring& T): hstring(T.getStr()) {}// 获取形参的字节长度unsigned short getLen(const char* hstring){while (hstring[this->len++]);return len;}// 重新赋值操作void setStr(const char* hstring){// 先删除地址delete[] m_str;len = getLen(hstring);m_str = new char[len];memcpy(m_str, hstring, len);}// 获取lenunsigned short getLen() const{return len;}// 获取 m_strchar* getStr() const{return m_str;}// 析构函数:释放内存~hstring(){delete[] m_str;}};
int main()
{hstring str("你好!");  // 构造函数hstring strA(str);      // 副本构造函数// 打印地址printf("%p\n", str.getStr());  printf("%p\n", strA.getStr());}

五、结束语

        自定义类hstring只是一个小的练习,里面的功能十分有限,到后面我还会持续的更新hstring的完整版,还请各位彦祖们多多支持!!!

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

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

相关文章

PHP框架之symfony框架

Symfony框架详解 Symfony是一个由SensioLabs公司开发并维护的PHP框架&#xff0c;旨在提高开发效率、代码复用性和应用的可维护性。自2005年发布以来&#xff0c;Symfony已成为众多开发者的首选框架之一&#xff0c;尤其在构建复杂的Web应用程序方面表现出色。 主要特点 高效…

文件扫描工具都有哪些?职场大佬都在用的文本提取工具大盘点~

回想起刚毕业初入职场那阵子&#xff0c;领导让帮忙把纸质文件扫描提取为文本时&#xff0c;还只会傻乎乎地一点点操作&#xff0c;属实是费劲得很&#xff01; 好在后面受朋友安利&#xff0c;找到了4个能够快速实现文件扫描文字提取的方法&#xff0c;这才让我的办公效率蹭蹭…

关于自学\跳槽\转行做网络安全行业的一些建议

很好&#xff0c;如果你是被题目吸引过来的&#xff0c;那请看完再走&#xff0c;还是有的~ 为什么写这篇文章 如何自学入行&#xff1f;如何小白跳槽&#xff0c;年纪大了如何转行等类似问题 &#xff0c;发现很多人都有这样的困惑。下面的文字其实是我以前的一个回答&#…

当site-packages的类型为.so,Python解释器不会提示或列出该模块可用的函数和类的原因及解决方法

原因&#xff1a; 当你在Python中导入一个.so文件&#xff08;或者任何扩展模块&#xff09;时&#xff0c;如果它不提供任何Python级别的接口或文档&#xff0c;Python解释器通常不会提示或列出可用的函数和类。这是因为扩展模块可能是用C语言编写的&#xff0c;并且它们通常…

MyBatis-For input string: “oqm“ 异常

前言 具体的异常信息如下&#xff1a; Error attempting to get column open_id from result set. Cause: java.lang.NumberFormatException: For input string: "oqmJX5ZPU1KOv-YDt30GNAN-Zefk" 乍一看下其实就是无法把open_id字符串类型转为数字类型进行赋值&…

Elasticsearch RestclientApi基础用法

Elasticsearch RestclientApi基础用法 索引 初始化 添加依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>创建链接 package com.hmall.i…

synchronized原理

当线程释放锁&#xff0c;JMM会把线程对应的本地的内存中的共享变量刷新到内存中 当线程获取锁&#xff0c;JMM会帮其他线程中对应的本地的内存中的共享变量设置未无效&#xff0c;从而监视器保护的临界区的代码必须从内存中读取共享变量。&#xff08;临界区为锁之间的代码&am…

3D模型可视化引擎HOOPS Communicator与Visualize的统一化文件加载解决方案

在当今数字化时代&#xff0c;3D可视化技术已成为工程设计、建筑规划和游戏开发等多个领域的核心技术。Tech Soft 3D公司凭借其创新的HOOPS Communicator和HOOPS Visualize两款开发包&#xff0c;分别针对Web端和桌面端提供了强大的3D可视化解决方案。然而&#xff0c;由于两者…

第三集《唯识与净土》

和尚尼慈悲&#xff01;诸位法师、诸位居士&#xff0c;阿弥陀佛&#xff01; 请大家打开讲义第六面&#xff0c;三、业果强弱。 我们身为一个有情众生&#xff0c;在我们的生命当中&#xff0c;我们曾经出现过很多痛苦的果报&#xff0c;当然也出现过很多安乐的果报&#xff0…

c语言回顾-结构体(2)

前言 前面讲了结构体的概念&#xff0c;定义&#xff0c;赋值&#xff0c;访问等知识&#xff0c;本节内容小编将讲解结构体的内存大小的计算以及通过结构体实现位段&#xff0c;话不多说&#xff0c;直接上干货&#xff01;&#xff01;&#xff01; 1.结构体内存对齐 说到计…

物联网技术-第3章物联网感知技术-3.2定位技术

目录 1.1位置信息和位置服务 1.1.1位置信息 1.1.2位置服务 1.2主流定位系统 1.2.1卫星定位系统&#xff08;Satellite Positioning Systems&#xff09; 1.2.2移动通信蜂窝基站定位&#xff08;Cellular Triangulation or Advanced Forward Link Trilateration&#xff09…

大学物理绪论组收集和分析

目录 ​编辑 随机误差的估计 算术平均值的标准偏差 不确定度&#xff08;Uncertainty&#xff09;是测量学中的一个重要概念&#xff0c;用于表示测量结果的可靠程度。它反映了测量值可能偏离真值&#xff08;即被测量的客观真实值&#xff09;的程度。 A类不确定度的计算方…

cephfs的形式使用ceph,大致思路

有很多方式可以使用ceph&#xff0c;感觉作者的大概的思路就是&#xff0c;把ceph当成一个存储中心&#xff0c;然后可以通过很多中不同的方式把数据放到这个存储中心来&#xff0c;也可以读取。 ceph存储数据的大致思路是&#xff0c;建立osd&#xff0c;把osd当数据存储基点…

健身小程序:智能化助力个人健身旅程

一、智能化功能的核心 健身小程序的智能化功能主要体现在以下几个方面&#xff1a; 智能健身计划推荐&#xff1a;小程序内置了先进的算法&#xff0c;能够根据用户的身体状况、健身目标和时间安排&#xff0c;智能推荐个性化的健身计划。这些计划不仅科学合理&#xff0c;而且…

TCP协议是安全的吗?

不安全 虽然 TCP 提供了一种可靠且高效的数据传输方式&#xff0c;但它不提供任何加密或身份验证机制来保护数据。因此&#xff0c;传输的数据可能会被未经授权的用户拦截和读取&#xff0c;而且其真实性无法验证。 因此&#xff0c;为了确保 TCP 通信的安全&#xff0c;必须…

ThreeJS-截屏下载pdf或者图片时白屏

JS-页面截图下载为pdf 关于如何下载为 pdf 在上面的这篇文章中有写&#xff0c;大家可以看下&#xff0c;下载图片代码在最下面 这时我们发现 three 部分是空白的如下&#xff1a; 这就多少有点尴尬了&#xff0c;这时我们习惯性的看下后台报错 是不是发现了惊喜&#xff0c;…

足底筋膜炎怎么治疗效果好得快

足底筋膜炎症状&#xff1a;疼痛是足底筋膜炎最典型和常见的症状。患者通常会感到足跟或足底区域的疼痛&#xff0c;这种疼痛可能表现为刺痛、钝痛或灼热感。疼痛的程度和频率因人而异&#xff0c;但通常会在早晨起床后或长时间休息后首次站立时最为明显。这是因为休息时足底筋…

.NET C# 读写CSV及转换DataTable

目录 .NET C# 读写CSV及转换DataTable1. 依赖库2. CSVUtil2.1 CSV 转 DataTable2.2 DataTable 转 CSV 文本2.3 DataTable 转 CSV2.4 私有方法 .NET C# 读写CSV及转换DataTable 1. 依赖库 using System.Data; using System.IO; using System.Text; using System.Text.RegularE…

eclipse宝刀未老

Theia 是一个高度可定制的、开源的、基于 Web 的集成开发环境&#xff08;IDE&#xff09;框架。它由 Eclipse Foundation 主导&#xff0c;旨在为云和本地环境提供现代化的、全功能的 IDE 解决方案。Theia 的核心目标是提供一个灵活的平台&#xff0c;开发者可以根据自己的需求…

睡眠脑电 | 多导睡眠图技术

摘要 多导睡眠图(PSG)一词由Holland等人于1974年提出&#xff0c;用于描述在睡眠期间同时记录、分析和解释多个生理特征。PSG是诊断睡眠障碍患者和增进我们对正常睡眠认识的重要工具。这是一个复杂的过程&#xff0c;应由训练有素的技术人员执行。本文回顾了多导睡眠图(PSG)的…