MyString字符串类

news2024/11/28 22:47:52

MyString字符串类

包括:有参构造、拷贝构造、移动构造、析构、拷贝赋值和移动赋值。

MyString.h文件

#ifndef MYSTRING_H
#define MYSTRING_H

#include <iostream>
using namespace std;

class MyString
{
    private:
        char* str;
        unsigned int MaxSize;
        unsigned int Length = 0;
    public:
        MyString() = default;              /*默认构造函数*/
        MyString(unsigned int m);          /*构造函数,空字符串*/
        MyString(const char* S);           /*构造函数,写入字符串*/
        MyString(const MyString& S);       /*拷贝构造函数*/
        MyString( MyString && S) noexcept; /*移动构造函数*/
        ~MyString();                       /*析构函数*/
        /*获取字符串长度*/
        unsigned int GetLength();
        /*字符串输出*/
       friend ostream& operator<< (ostream& Output, MyString& S);
        /*字符串输入*/
       friend  istream& operator>> (istream& Input, MyString& S);
       /*获取单个字符*/
       char & operator[] (unsigned int i);
       /*添加或修改单个字符*/
       void at(char ch);
       void at(unsigned int i, char ch);
       /*字符串比较*/
       bool operator== (MyString & S2);
       bool operator> (MyString & S2);
       bool operator< (MyString & S2);
       /*拷贝赋值运算符重载*/
       MyString& operator= (MyString& S);
       /*移动赋值运算符重载*/
       MyString& operator= (MyString&& S) noexcept;
       /*字符串链接函数*/
       MyString operator+ (MyString& S2);
};

#endif

MyString.cpp文件

#include "MyString.h"

/*构造函数,空字符串*/
MyString::MyString(unsigned int m) :MaxSize(m)
{
    MaxSize += 1;
    str = new char[MaxSize] {};
    str[MaxSize-1] = '\0';
    cout << "空构造函数:";
}
/*构造函数,写入字符串*/
MyString::MyString(const char* S)
{
    const char* p = S;
    while (*p != '\0')
    {
        p++;
        Length++;
    }
    MaxSize = Length + 1;
    str = new char[MaxSize] {};
    for (unsigned int i = 0; i < Length; i++)
    {
        str[i] = S[i];
    }
        str[Length] = '\0';
        cout << "字符串构造函数:" ;
}
/*拷贝构造函数*/
MyString::MyString(const MyString& S)
{
   Length = S.Length;
    MaxSize = S.MaxSize;
    str = new char[MaxSize] {};
    for (unsigned int i = 0; i < MaxSize; i++)
    {
       str[i] = S.str[i];
    }
    cout << "拷贝构造函数:";
}
/*移动构造函数*/
MyString::MyString(MyString&& S) noexcept
{
    Length = S.Length;
    MaxSize = S.MaxSize;
    str =S.str;
    S.str = nullptr;
    cout << "移动构造函数:";
}
/*析构函数*/
MyString::~MyString()
{
    delete[] str;
    cout << "析构函数" << endl;
}
/*返回字符串长度*/
unsigned int MyString::GetLength()
{
    return Length;
}
/*字符串输入*/
ostream& operator<< (ostream& Output, MyString& S)
{
    Output << S.str;
    return Output;
}
/*字符串输出*/
istream& operator>> (istream& Input, MyString& S)
{
    Input >> S.str;
    return Input;
}
/*获取单个字符*/
char & MyString::operator[] (unsigned int i)
{
    return str[i];
}
/*添加或修改单个字符*/
void  MyString::at(char ch)
{
    if (Length < MaxSize - 1)
        str[Length] = ch;
    Length++;
}
void MyString::at(unsigned int i, char ch)
{
    if( i < Length)
        str[i] = ch;
}
/*字符串比较函数*/
bool MyString::operator== (MyString & S2)
{
    char* str1 = str;
    char* str2 = S2.str;
    while (*str1 != '\0' || *str2 != '\0')
    {
        if (*str1 > *str2)
            return false;
        if (*str1 < *str2)
            return false;
        str1++;
        str2++;
    }
    return true;
}
bool MyString::operator> (MyString & S2)
{
    char* str1 = str;
    char* str2 = S2.str;
    while (*str1 != '\0' || *str2 != '\0')
    {
        if (*str1 > *str2)
            return true;
        if (*str1 < *str2)
            return false;
        str1++;
        str2++;
    }
    return false;
}
bool MyString::operator< (MyString & S2)
{
    char* str1 = str;
    char* str2 = S2.str;
    while (*str != '\0' || *str2 != '\0')
    {
        if (*str1 > *str2)
            return false;
        if (*str1 < *str2)
            return true;
        str1++;
        str2++;
    }
    return false;
}
/*赋值运算符重载*/
MyString & MyString::operator= (MyString& S)
{
    delete[] str;
    Length = S.Length;
    MaxSize = S.MaxSize;
    str = new char[MaxSize] {};
    for (unsigned int i = 0; i < MaxSize; i++)
    {
        str[i] = S.str[i];
    }
    cout << "拷贝赋值运算符重载:";
    return *this;
}
/*移动赋值运算符重载*/
MyString& MyString::operator= (MyString&& S) noexcept
{
    delete[] str;
    Length = S.Length;
    MaxSize = S.MaxSize;
    str = S.str;
    S.str = nullptr;
    cout << "移动赋值运算符重载:";
    return *this;
}
/*字符串链接函数*/
MyString MyString::operator+ (MyString& S2)
{
    MaxSize += S2.MaxSize;
    char* temp = new char[MaxSize] {};
    for (unsigned int i = 0; i < Length; i++)
    {
        temp[i] = str[i];
    }
    temp[Length] = ' ';
    Length += 1;
    for (unsigned int i = Length; i < MaxSize; i++)
    {
        temp[i] = S2.str[i - Length];
    }
    Length += S2.Length;
    delete[]str;
    str = temp;

    return *this;
}

main.cpp测试:

#include <iostream>
using namespace std;

#include "MyString.h"
MyString  GetString()
{
 //   MyString n =  "1234";
//    MyString m(2);
    MyString temp = "C++";
   return temp;
}
int main()
{
    MyString S1{ "Hello World!" };  //构造函数,字符串初始化
    cout << S1 <<' '<< S1.GetLength() << endl;
    MyString S2{ S1 } ;  //拷贝构造函数
    cout << S2 <<' '<< S2.GetLength() << endl;
    MyString S3{ 3 };   //构造函数,空字符串
    S3.at('A');
    S3.at('B');
    S3.at('C');
    cout << S3 <<' '<< S3.GetLength() << endl;
    S3[2] = 'Z';
    cout << S3[2] << endl;
    S1 =  S3;               /拷贝赋值
    cout << S1 << ' ' << S1.GetLength() << endl;
    cout << (S1 < S2) << endl;
    cout << (S1 > S2) << endl;
    cout << (S1 == S2) << endl;
    MyString S4{ move(S1) }; //移动构造函数
    cout << S4 << ' ' << S4.GetLength() << endl;
    S4 = GetString();      //移动赋值
    cout << S4 << ' ' << S4.GetLength() << endl;
    S4 = S2 + S3;
    cout << S4 << ' ' << S4.GetLength() << endl;
}

测试结果:

MyString

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

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

相关文章

C语言 定义一个函数,并调用,该函数中完成百文百鸡问题

#include<stdio.h> int main(int argc, char const *argv[]) {int num 0;for (int i 0; i < 33; i){for (int j 0; j < 50; j){int x 100 - i - j;if(3*i2*jx/3 100 && x%3 0){printf("&#x1f413;有%d只,母鸡有%d只,小鸡有%d只\n",i,j,…

深度学习之基于yolov8的安全帽检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、基于yolov8的安全帽检测系统四. 总结 一项目简介 在企业作业和工地施工过程中&#xff0c;安全永远高于一切。众所周知&#xff0c;工人在进入…

【C++】STL容器——list类的使用指南(含代码演示)(13)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一、list 类——基本介绍二、list 类——…

僵尸网络|让人防不胜防的内部网络安全问题,作为企业IT不得不了解的基础安全

在当今数字化世界中&#xff0c;僵尸网络是一种令人不安的存在。它不是一种具体的物理实体&#xff0c;而是一种由恶意软件控制的虚拟网络。这个网络由成百上千&#xff0c;甚至数百万台计算机组成&#xff0c;这些计算机往往被感染&#xff0c;成为攻击者的"僵尸"&a…

基于深度学习的水果识别系统

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、 水果识别的实验结果分析3.1 实验环境3.2 水果数据集 二、水果识别的界面展示结 论目录 概要 本文详细地介绍了深度学习算法卷积神经网络&#xff08;CNN&#xff09;的发展状况。主要介绍了卷积神经网络的几…

用示例和应用程序了解必要的Golang库

Golang&#xff0c;也被称为Go&#xff0c;因其简单性、性能和并发性支持而在开发人员中迅速流行起来。导致Go成功的关键因素之一是其丰富的库生态系统&#xff0c;可以简化开发并提供解决常见问题的解决方案。在本文中&#xff0c;我们将更仔细地查看一些必要的Golang库&#…

若依框架的使用+代码生成功能

文章目录 导入数据表数据创建一个菜单项生成模块代码导入需要生成的数据表修改需要生成的字段 生成代码使用放行接口接口测试 导入数据表数据 可以使用sql工具等等,导入数据表的数据(安全性考虑,导入图片不贴了) 创建一个菜单项 在系统管理下的菜单管理中创建一个新的菜单项…

【Java 进阶篇】Java Request 请求转发详解

在Java Web开发中&#xff0c;请求转发&#xff08;Request Forwarding&#xff09;是一种常见的技术&#xff0c;用于将请求从一个Servlet转发到另一个Servlet或JSP页面。这种技术在Web应用程序中起着非常重要的作用&#xff0c;可以用于实现模块化、重用代码以及构建更加灵活…

类和对象【上】

目录 面向过程和面向对象 C语言 C 类的定义 类的两种定义方式 成员变量命名规则 类的访问限定符和封装 面试题 封装 类的作用域 类的实例化 类对象模型 内存分配 内存对齐 this指针 特性 面试题 this指针存储在哪里&#xff1f; this指针可以为空么&#xff1…

力扣刷题 day58:10-28

1.奇偶位数 给你一个 正 整数 n 。 用 even 表示在 n 的二进制形式&#xff08;下标从 0 开始&#xff09;中值为 1 的偶数下标的个数。 用 odd 表示在 n 的二进制形式&#xff08;下标从 0 开始&#xff09;中值为 1 的奇数下标的个数。 返回整数数组 answer &#xff0c;…

Linux对网络通信的实现

一、NIO为什么很少注册OP_WRITE事件 1、OP_WRITE触发条件&#xff1a;当操作系统写缓冲区有空闲时就绪。一般情况下写缓冲区都有空闲空间&#xff0c;小块数据直接写入即可&#xff0c;没必要注册该操作类型&#xff0c;否则该条件不断就绪浪费cpu&#xff1b;但如果是写密集型…

200smart 物料分拣案例

[TOC]物料分拣 控制系统动作流程 物料为空时&#xff0c;第三个气缸推出 物料为黑色时&#xff0c;第二个气缸推出 物料为白色时&#xff0c;第一个气缸推出 原理 光电传感器起 到位传感器作用 物料为空时&#xff0c;第三个气缸推出 物料为黑色时&#xff0c;第二个气缸…

正则表达式包含数字和字符匹配

至少6位。 pattern : (?.[0-9])(?.[A-Za-z])[0-9A-Za-z]{6,} 正则表达式中的“?”是一个正向预查字符&#xff0c;它的意思是匹配前一个字符出现的最少一次。具体来说&#xff0c;当一个匹配出现时&#xff0c;它会检查前一个字符是否符合要求&#xff0c;如果符合&#xf…

自学爬虫—作业1—requests模块

视频&#xff1a; 要求&#xff1a; 肯德基地址查询&#xff0c;爬某个关键字&#xff0c;获取下面的所有page的信息&#xff0c;存到一个json或者txt。 代码&#xff1a; 关键点&#xff0c;&#xff08;1&#xff09;每一个ajax的请求第一个键值对就是所有获得的地址的总数…

IOC课程整理-14 Spring 数据绑定

1. Spring 数据绑定使用场景 2. Spring 数据绑定组件 • DataBinder 绑定方法 • bind(PropertyValues)&#xff1a;将 PropertyValues Key-Value 内容映射到关联Bean&#xff08;target&#xff09;中的属性上 • 假设 PropertyValues 中包含“name 小裕哥”的键值对&#xf…

关于ABB 机器人多任务的建立

关于ABB 机器人多任务的建立.需要实时监控某一区域&#xff0c;或者某一信号&#xff0c;或者计件到达某一数量机器人自动停止报警&#xff0c;显示到示教器上&#xff0c;多任务可以实现&#xff0c;类似发那科机器人后台逻辑指令 当软件选项漏选或者少选可以选择修改选项&…

redis的bitmap(面试题,待补充)

位图简介 如果我们需要记录某一用户在一年中每天是否有登录我们的系统这一需求该如何完成呢&#xff1f;如果使用KV存储&#xff0c;每个用户需要记录365个&#xff0c;当用户量上亿时&#xff0c;这所需要的存储空间是惊人的。 Redis 为我们提供了位图这一数据结构&#xff…

[AUTOSAR][诊断管理][ECU][$34] 下载请求

文章目录 一、简介二、服务请求报文定义肯定响应支持的NRC三、示例代码34_req_dowload.c一、简介 RequestDownload(0x34)—— 下载请求 这个服务主要是用来给ECU下载数据的,最常见的应用就是在bootloader中,程序下载工具会发起下载请求,以完成ECU程序的升级。 二、服务…

python实验2 π的计算

π的计算 1. 圆周率的介绍2. BBP公式计算圆周率3. 蒙特卡洛方法计算π 1. 圆周率的介绍 圆周率π自古就是人们计算的问题&#xff0c;π到底是什么&#xff0c;圆的周长与直径的比值或者是面积与半径的平方之比&#xff0c;或者是使sinx0的最小正数x。所以每一种定义每一种理解…

FreeRTOS 中断管理介绍和实操

目录 中断定义 中断优先级 相关注意 中断相关函数 1.队列 2.信号量 3.事件标志组 4.任务通知 5.软件定时器 中断管理实操 中断定义 中断是指在程序执行的过程中&#xff0c;突然发生了某种事件&#xff0c;需要立即停止当前正在执行的程序&#xff0c;并转而处理这个…