c++仿照string类,完成myString 类

news2024/11/24 9:03:14
#include <iostream>
#include <cstring>
 
using namespace std;
 
class myString
{
    private:
        char *str;          //记录c风格的字符串
        int size;            //记录字符串的实际长度
    public:
        //无参构造
        myString():size(10)
        {
            str = new char[size+1];         //构造出一个长度为10的字符串
            strcpy(str,"");         //赋值为空串
            //cout<<"无参构造"<<endl;
        }
        //有参构造
        myString(const char *s)          //string  s("hello world")
        {
             size = strlen(s);
             str = new char[size+1];
             strcpy(str, s);
             //cout<<"有参构造"<<endl;
        }
        //拷贝构造  深拷贝
        myString(const myString &m):size(m.size){
            str = new char[size+1];
            strcpy(str, m.str);
           // cout<<"拷贝构造"<<endl;
        }
        //析构函数
        ~myString(){
            delete str;
            str = nullptr;
           // cout<<"析构函数"<<endl;
        }
        //拷贝赋值函数
 
        myString &operator=(const myString &s){
            size = s.size;
            //由于新字符串的长度不确定,所以先释放掉原来的内存空间,重新申请适合的内存空间
            delete str;
            str = new char[size+1];
            strcpy(str, s.str);
 
          //  cout<<"拷贝赋值"<<endl;
            return *this;
        }
        //判空函数
        bool str_empty(){
            return str == nullptr;
        }
        //size函数
        int str_size(){
            return size;
        }
        //c_str函数
        char *c_str(){
            char *c_string = new char[size + 1];
            strcpy(c_string, str);
            *(c_string+size) = 0;
            return c_string;
        }
        //at函数
        char &at(int pos){
            if(pos<0||pos>size-1){
                cout<<"参数错误"<<endl;
                return *str;
            }else{
                return *(str+pos);
            }
        }
        //加号运算符重载
        myString operator+(const myString &s){
            //定义一个临时字符串存储自身原本的数据
            myString tmp;
            //长度是自己的长度,加上目标字符串的长度
            tmp.size = size + s.size ;
            //在堆区重新申请一片合适大小的空间
            tmp.str = new char[tmp.size+1];
            //先拷贝自己原本的数据,放在前面
            strcpy(tmp.str, str);
            //定义一个指针指向用来保存目标字符串的位置
            char *tstr = tmp.str + size;
            //将目标字符串拷贝入空间
            strcpy(tstr, s.str);
 
            tstr = nullptr;
 
            return tmp;
        }
        myString operator+(const char* s){
            //定义一个临时字符串存储自身原本的数据
            myString tmp;
            //长度是自己的长度,加上目标字符串的长度
            tmp.size = size + strlen(s) ;
            //在堆区重新申请一片合适大小的空间
            tmp.str = new char[tmp.size+1];
            //先拷贝自己的数据,放在前面
            strcpy(tmp.str, str);
            //定义一个指针指向用来保存目标字符串的位置
            char *tstr = tmp.str + size;
            //将目标字符串拷贝入空间
            strcpy(tstr, s);
 
            tstr = nullptr;
 
            return tmp;
        }
        //等号运算符重载
        myString &operator=(const char* s){
            size = strlen(s);
            //由于新字符串的长度不确定,所以先释放掉原来的内存空间,重新申请适合的内存空间
            delete str;
            str = new char[size+1];
            strcpy(str, s);
 
            return *this;
        }
        //加等于运算符重载
        myString &operator+=(const myString &s){
            //定义一个临时字符串存储自身原本的数据
            myString tmp(*this);
            //长度是原来自己的长度,加上目标字符串的长度
            size = tmp.size + s.size ;
            //释放自身原本指向的堆区空间
            delete str;
            //在堆区重新申请一片合适大小的空间
            str = new char[size+1];
            //先拷贝自己原本的数据,放在前面
            strcpy(str, tmp.str);
            //定义一个指针指向用来保存目标字符串的位置
            char *tstr = str + tmp.size;
            //将目标字符串拷贝入空间
            strcpy(tstr, s.str);
 
            tstr = nullptr;
 
            return *this;
        }
        myString &operator+=(const char*s){
            //定义一个临时字符串存储自身原本的数据
            myString tmp(*this);
            //长度是原来自己的长度,加上目标字符串的长度
            size = tmp.size + strlen(s);
            //释放自身原本指向的堆区空间
            delete str;
            //在堆区重新申请一片合适大小的空间
            str = new char[size+1];
            //先拷贝自己原本的数据,放在前面
            strcpy(str, tmp.str);
            //定义一个指针指向用来保存目标字符串的位置
            char *tstr = str + tmp.size;
            //将目标字符串拷贝入空间
            strcpy(tstr, s);
 
            tstr = nullptr;
 
            return *this;
        }
        //关系运算符重载(>)
        bool operator>(const myString &s){
            int i=0;
            while (*(str+i)==*(s.str+i)&&*(str+i)!=0&&*(s.str+i)!=0){
                i++;
            }
            return *(str+i)-*(s.str+i)>0;
        }
        bool operator<(const myString &s){
            int i=0;
            while (*(str+i)==*(s.str+i)&&*(str+i)!=0&&*(s.str+i)!=0){
                i++;
            }
            return *(str+i)-*(s.str+i)<0;
        }
        bool operator==(const myString &s){
            int i=0;
            while (*(str+i)==*(s.str+i)&&*(str+i)!=0&&*(s.str+i)!=0){
                i++;
            }
            return *(str+i)==*(s.str+i);
        }
        bool operator!=(const myString &s){
            int i=0;
            while (*(str+i)==*(s.str+i)&&*(str+i)!=0&&*(s.str+i)!=0){
                i++;
            }
            return *(str+i)-*(s.str+i)!=0;
        }
        bool operator<=(const myString &s){
            int i=0;
            while (*(str+i)==*(s.str+i)&&*(str+i)!=0&&*(s.str+i)!=0){
                i++;
            }
            return *(str+i)-*(s.str+i)<=0;
        }
        bool operator>=(const myString &s){
            int i=0;
            while (*(str+i)==*(s.str+i)&&*(str+i)!=0&&*(s.str+i)!=0){
                i++;
            }
            return *(str+i)-*(s.str+i)>=0;
        }
        //中括号运算符重载
        char &operator[](int pos){
            if(pos<0||pos>size-1){
                cout<<"参数错误"<<endl;
                return *str;
            }else{
                return *(str+pos);
            }
        }
        //展示函数
        void show(){
            cout<<str<<endl;
        }
};
 
int main()
{
    myString s1("hello ");
    myString s2 = "world";
    myString s3;
    s3 = s1+s2;
    cout<<"s3:";
    s3.show();
    myString s4 = s3;
    cout<<"s4:";
    s4.show();
    s1+=s2;
    cout<<"s1:";
    s1.show();
    s1[5] = 'O';
    cout<<"s1:";
    s1.show();
    s1.at(5) = 'o';
    s1.at(4) = 'O';
    cout<<"s1:";
    s1.show();
    myString s5("hellow");
 
 
    return 0;
}

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

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

相关文章

Java“牵手”1688商品详情数据,1688商品详情接口,1688API接口申请指南

1688商品详情API接口的作用是获取1688平台上某个商品的详细信息&#xff0c;包括商品标题、价格、图片、规格、参数、店铺信息等。 开发者可以通过该接口获取到商品的原始数据&#xff0c;方便进行数据分析、价格比较、爬取等操作。通过该接口获取到的商品详情数据可以结合其他…

tkintter四大按钮:Button,Checkbutton, Radiobutton, Menubutton

文章目录 四大按钮Button连击MenubuttonCheckbuttonRadiobutton tkinter系列&#xff1a; GUI初步&#x1f48e;布局&#x1f48e;绑定变量&#x1f48e;绑定事件&#x1f48e;消息框&#x1f48e;文件对话框控件样式扫雷小游戏&#x1f48e;强行表白神器 四大按钮 tkinter中…

有哪些常用的压力测试工具,移动网站压力测试流程有哪些内容?

压力测试工具 在移动网络飞速发展的今天&#xff0c;移动网站成为企业对外宣传、开展业务的重要窗口&#xff0c; 对于访客量大的网站来说&#xff0c;一旦其无法承受过于巨大的流量&#xff0c;就会使网站崩溃&#xff0c;进而影响公司正常的业务。与之相对应的&#xff0c;…

故障排除指南:解决 Kibana Discover 加载中的 6 个常见问题

作者&#xff1a;Steffanie Nestor Discover 是 Elastic 的核心 Kibana UI&#xff0c;用于搜索、过滤和检查&#xff08;时间序列&#xff09;数据。 可视化用于数据聚合/摘要。 Discover UI 对于大数据 Elasticsearch 响应具有弹性&#xff0c;但有时会因&#xff08;未压缩的…

VRTK4⭐一.VRTK4和VRTK的区别 , 及VRTK4简介

文章目录 &#x1f7e5; VRTK4和VRTK的区别1️⃣ 版本区别2️⃣安装方式区别 &#x1f7e7; 安装VRTK41️⃣ AssetStore网址2️⃣安装不同功能的包 &#x1f7e9;Tilia的独立功能包介绍及配置方法&#x1f381;Tilia.CameraRigs.SpatialSimulator.Unity [重要]&#x1f381;Til…

济南市图书馆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

济南市图书馆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

ASP.NET+sqlserver通用电子病历管理系统

一、源码描述 这是一款简洁十分美观的ASP.NETsqlserver源码&#xff0c;界面十分美观&#xff0c;功能也比较全面&#xff0c;比较适合 作为毕业设计、课程设计、使用&#xff0c;感兴趣的朋友可以下载看看哦 二、功能介绍 该源码功能十分的全面&#xff0c;具体介绍如下&…

【Java 基础篇】Java TreeSet 详解:红黑树实现的有序集合

Java 集合框架提供了多种数据结构&#xff0c;用于存储和操作数据。其中&#xff0c;TreeSet 是一种特殊类型的集合&#xff0c;它通过红黑树&#xff08;Red-Black Tree&#xff09;数据结构实现了有序的、唯一元素存储。本篇博客将深入探讨 TreeSet&#xff0c;包括其概念、特…

【C++技能树】手撕AVL树 --插入与旋转详解

Halo&#xff0c;这里是Ppeua。平时主要更新C&#xff0c;数据结构算法&#xff0c;Linux与ROS…感兴趣就关注我bua&#xff01; 文章目录 0.平衡搜索二叉树概念0.1 平衡因子 1.插入1.1 普通插入操作1.2更新平衡因子 2.旋转2.1 左单旋2.2 右单旋2.3 右左双旋2.4 左右双旋 3. 旋…

量化:Fama-French五因子模型复现

文章目录 参考三因子模型概述策略设计 五因子模型概述 参考 掘金-fama三因子 b站-fama三因子 知乎-fama五因子 因子溢价、因子暴露及用途 三因子模型 概述 在CAPM模型的基础上加入了两个因子提出了三因子模型&#xff0c;三因子分别为 市场因子MKT规模因子SMB&#xff08;S…

收货已完成,删除采购订单没有任何提示

收货已完成或发票已校验&#xff0c;此时删除订单系统是不允许的&#xff0c;正常会报错06115&#xff0c; 现在问题是生产机不报这个消息&#xff0c;直接删除了订单行&#xff0c;查了一下资料&#xff0c;都说这个配置是系统写死的&#xff0c;通过增加06115的消息号 也不起…

算法:经典贪心算法--跳一跳[2]

1、题目&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 返回到达 nums[n - 1] 的最小跳跃次数。生…

Maven 安装配置

Maven 安装配置 文章目录 Maven 安装配置一、下载 Maven二、解压Maven核心程序三、指定本地仓库四、配置阿里云镜像仓库4.1 将原有的例子配置注释掉4.2 加入新的配置 五、配置 Maven 工程的基础 JDK 版本六、配置环境变量6.1 检查 JAVAHOME 配置是否正确6.2 配置 MAVENHOME6.3 …

一个综合资产收集和漏洞扫描工具

Komo 介绍 Komo是一个综合资产收集和漏洞扫描工具&#xff0c;并且支持进度记录&#xff0c;通过多种方式对子域进行获取&#xff0c;收集域名&#xff0c;邮箱&#xff0c;子域名存活探测&#xff0c;域名指纹识别&#xff0c;域名反查ip&#xff0c;ip端口扫描&#xff0c;w…

Python 图形化界面基础篇:添加按钮( Button )到 Tkinter 窗口

Python 图形化界面基础篇&#xff1a;添加按钮&#xff08; Button &#xff09;到 Tkinter 窗口 引言什么是 Tkinter 按钮&#xff08; Button &#xff09;&#xff1f;步骤1&#xff1a;导入 Tkinter 模块步骤2&#xff1a;创建 Tkinter 窗口步骤3&#xff1a;创建按钮&…

2023年9月12日

实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xff1a;半…

【C++】STL之string

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言string类的内部成员变量&#xff1a; string的模拟实现**六个默认成员函数****iterator****capacity****modify**element access**String operations**Non-memb…

分布式id的概述与实现

文章目录 前言一、分布式id技术选型二、雪花算法三、在项目中集成雪花算法 前言 随着业务的增长&#xff0c;数据表可能要占用很大的物理存储空间&#xff0c;为了解决该问题&#xff0c;后期使用数据库分片技术。将一个数据库进行拆分&#xff0c;通过数据库中间件连接。如果…

C语言顺序表

文章目录 前言线性表顺序表静态顺序表动态顺序表 接口实现 前言 我们先补一下上篇博客落下的知识点&#xff1a; 首先说一下斐波那契的时间复杂度和空间复杂度&#xff1a; long long Fac(size_t N) {if(0 N)return 1;return Fac(N-1)*N; }还是说一下size_t代表的类型是unsi…

C#,数值计算——伽马微分(Gammadev)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Gammadev : Normaldev { private double alph { get; set; } private double oalph { get; set; } private double bet { get; set; } private double a1 { g…