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;
    }  

    // 获取len
    unsigned short getLen() const
    {
        return len;
    }
    // 获取 m_str
    char* 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);
    }
    // 获取len
    unsigned short getLen() const
    {
        return len;
    }
    // 获取 m_str
    char* 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的完整版,还请各位彦祖们多多支持!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖音素材网站平台有哪些?素材下载网站库分享

在这个视觉信息充斥的时代&#xff0c;抖音已经成为众多自媒体人展示才华的舞台。要在众多创作者中脱颖而出&#xff0c;不仅需要独特的创意&#xff0c;还需要优质的素材来支持你的内容制作。今天&#xff0c;我将介绍几个为抖音视频提供高品质素材的网站&#xff0c;包括国内…

Python构造TCP三次握手、传输数据、四次挥手pcap数据包并打乱顺序

Python构造数据包&#xff0c;包含&#xff1a; TCP三次握手、 传输数据、 四次挥手 实现 随机乱序TCP数据包 from scapy.all import * from scapy.all import Ether, IP, TCP, UDP, wrpcap from abc import ABC, abstractmethod import random import dpkt from scapy.all…

训练营第四十二天| 583. 两个字符串的删除操作72. 编辑距离647. 回文子串516.最长回文子序列

583. 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#xff0c;每步可以删除任意一个字符串中的一个字符。 示例&#xff1a; 输入: "sea", "eat"输出: …

QT6不自动生成pro文件

安装了QT的新版本结果他不自动生成pro文件了导致下次打开很复杂 记得在创建时选择qmake&#xff0c;因为新版默认cmake

宝塔软件默认安装位置

自带的JDK /usr/local/btjdk/jdk8Tomcat 各个版本都在bttomcat这个文件夹下面&#xff0c;用版本区分。tomcat_bak8是备份文件 /usr/local/bttomcat/tomcat8nginx /www/server/nginxnginx配置文件存放目录 /www/server/panel/vhost/nginxredis /www/server/redismysql /…

财讯杂志财讯杂志社财讯编辑部2024年第6期目录查询

财税研究 “互联网税务”模式在企业税务管理中的应用 陈飞; 1-3 国有企业税务稽查的问题与对策研究 梁涵瑜; 4-6 税务师事务所执业质量内部控制优化路径及风险防范 万晓玲; 7-9《财讯》投稿&#xff1a;cnqikantg126.com 基于全过程的新能源电力投资企业税务筹…

宝塔面板使用技巧(pure-FTP)上传文件和文件夹默认权限644的修改

前言 科技在进步各种各样的开源软件和库让我们应接不暇&#xff0c;我估计现在所有做php开发的人员都知道宝塔面板&#xff0c;我就经常用&#xff0c;但是不知道大家出现过一个问题不就是在我们开发过程中需要实时的给服务器上传我们开发的文件那么就涉及到了宝塔自带的pure-F…

BC-Linux 8.6最小化安装的服务器启用GNOME图形化界面

本文记录了BC-Linux 8.6最小化安装的服务器如何启用GNOME图形化界面的过程。 一、服务器环境 1、系统版本 [rootlocalhost ~]# cat /etc/os-release NAME"BigCloud Enterprise Linux" VERSION"8.6 (Core)" ID"bclinux" ID_LIKE"rhel fe…

央国企财务专家的“专家课”——中国总会计师协会联合实在智能举办RPA专项培训

近日&#xff0c;中国总会计师协会正式举办了为期五天的「财务数字化思维与实用IT技能提升」专项培训&#xff0c;吸引了来自中铁十五局集团有限公司、中国航空工业规划设计院、中核核电运行管理有限公司、中国北方车辆有限公司、一汽物流有限公司等国企、事业单位及民营企业共…

eclipse宝刀未老

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

【ARM】MDK自动备份源文件

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决MDK在编写文档的时候需要找回上一版代码的问题。 2、 问题场景 目前大部分情况下对于源代码的管理都是使用的Git等第三方的代码管理平台。这样的第三方代码管理平台都是针对与代码的版本更新进行管理。对于本地…

帕金森患者宜居环境指南,温馨舒适助康复

&#x1f338;帕金森病&#xff0c;优质的居住环境能极大地提升患者的生活质量。今天&#xff0c;就为大家分享一下帕金森患者宜居环境的几个关键点&#xff0c;希望每位患者都能拥有一个温馨舒适的康复空间。 &#x1f6cb;️首先&#xff0c;布局要合理。对于帕金森患者来说&…

XMLXXE实体注入

XML&XXE实体注入 原理 XML被设计为传输和存储数据&#xff0c;XML文档结构包括XML声明、DTD文档类型定义&#xff08;可选&#xff09;、文档元素&#xff0c;其焦点是数据的内容&#xff0c;其把数据从HTML分离&#xff0c;是独立于软件和硬件的信息传输工具。等同于JSO…

【面试干货】Java方法重写的规则

【面试干货】Java方法重写的规则 1、Java方法重写的规则2、示例代码3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;方法重写&#xff08;Overriding&#xff09;是面向对象编程中的一个核心概念&#xff0c;它…

具备智能灵敏度校准并可Pin to Pin替代TSM12的电容式触摸芯片GTX312L

电容式触摸芯片 - GTX312L是一款具有智能灵敏度校准功能的12通道电容式触摸芯片&#xff0c;采用I2C通信协议&#xff0c;对各种噪音和环境的变化可靠性有保障&#xff0c;低功率发动机可以增加产品的使用时间&#xff0c;内部控制寄存器可以使用I2C读写接口。 GTX312L具有内部…

记一次 .NET某机械臂上位系统 卡死分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友找到我&#xff0c;说他们的程序会偶发性的卡死一段时间&#xff0c;然后又好了&#xff0c;让我帮忙看下怎么回事&#xff1f;窗体类的程序解决起来相对来说比较简单&#xff0c;让朋友用procdump自动抓一个卡死时的dump&#x…

windows anaconda 安装 Labelme

安装 # 创建环境 conda create -n labelme python3.6 #激活环境 conda activate labelme # 安装依赖 conda install pyqt conda install pillow # 安装labelme conda install labelme3.16.2 # 启动labelme labelme右键选择标注类型&#xff0c;从上到下为多边形&#xff08;常…

Git分支的状态存储——stash命令的详细用法

文章目录 6.6 Git的分支状态存储6.6.1 git stash命令6.6.2 Git存储的基本使用6.6.3 Git存储的其他用法6.6.4 Git存储与暂存区6.6.5 Git存储的原理 6.6 Git的分支状态存储 有时&#xff0c;当我们在项目的一部分上已经工作一段时间后&#xff0c;所有东西都进入了混乱的状态&am…

机器学习课程复习——朴素贝叶斯

1. 定义 是一种基于贝叶斯定理与特征条件独立假设的生成式分类方法。 2. 公式 原版公式 简化版公式 由于上述公式无法计算&#xff0c;引入条件独立假设 条件独立版公式 3. 贝叶斯分类器 由上述公式可得贝叶斯分类器 化简为 4. 参数估计 4.1. 极大似然估计 4.2. 学习与分…

电子竞赛5——作息时间控制器

一 . 题目要求 用单片机制作作息时间控制器&#xff1b;用四位数码管显示实时时钟&#xff08;时、分&#xff0c;24小时制、12小时制&#xff09;&#xff0c;有秒闪&#xff0c;小时十位有零消隐&#xff1b;可用数字键或、-键校时&#xff08;可快速、-&#xff09;被校位&…