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

相关文章

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

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

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

很好&#xff0c;如果你是被题目吸引过来的&#xff0c;那请看完再走&#xff0c;还是有的~ 为什么写这篇文章 如何自学入行&#xff1f;如何小白跳槽&#xff0c;年纪大了如何转行等类似问题 &#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字符串类型转为数字类型进行赋值&…

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类不确定度的计算方…

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

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

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

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

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

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

eclipse宝刀未老

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

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

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

C#.Net筑基-类型系统②常见类型

01、结构体类型Struct 结构体 struct 是一种用户自定义的值类型&#xff0c;常用于定义一些简单&#xff08;轻量&#xff09;的数据结构。对于一些局部使用的数据结构&#xff0c;优先使用结构体&#xff0c;效率要高很多。 可以有构造函数&#xff0c;也可以没有。因此初始…

阿里又出AI神器,颠覆传统图像编辑,免费开源!

文章首发于公众号&#xff1a;X小鹿AI副业 大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 最近阿里开源了 Mi…

003.Linux SSH协议工具

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

最新麻豆MDYS14源码 油条视频 苹果CMS系统 附搭建教程

在数字化的时代&#xff0c;视频网站已经成为人们获取娱乐和信息的主要渠道之一。而在众多的视频网站中&#xff0c;使用麻豆MDYS14源码搭建的网站无疑是最具有吸引力的。本文将为你介绍麻豆MDYS14源码的基本特性&#xff0c;以及如何利用它打造一款完美的视频网站。 首先&…

记录一次mysql长事务的经历

目录 一.项目介绍 二.问题暴漏 三.问题排查 1.连接池方向 2.数据库方向 四.代码模拟 五.错误原因分析 1.MySQL参数优化 2.代码优化 六.总结 一.项目介绍 项目是springbootnacos的微服务架构,商城购物类系统,分多个服务,问题出现在众多服务中的单个服务 二.问题暴漏…

CAD二次开发(11)-在用C#进行CAD开发SQLite和SqlSugar的使用

1. System.Data.SQLite的使用 1.1 包的引入 利用 Nuget引入其相关包 1.2 App.config配置引入到CAD 因为我们当前的项目是类库项目&#xff0c;需要依托于宿主程序才可以运行&#xff0c;所以我们就得需要将SQLite自动生成的App.config里面的部分配置移植到CAD的配置文件中…