当前位置: 首页 > article >正文

2024.9.2

还没写完 

#include <iostream>
#include <cstring>
using namespace std;

class myString
{
private:
    char *str;          //字符串
    int size;           //实际字符长度
    int len;            //字符串容量
public:
    myString():size(10)     //无参构造函数
    {
        len = size + 1;
        str = new char[size];
    }
    myString(const char*s):size(strlen(s))      //有参构造函数
    {
        //cout<<size<<endl;
        len = size + 1;
        str = new char[size+1];
        strcpy(str,s);
    }
    ~myString()         //析构函数
    {
        delete []str;
    }
    myString &operator=(const myString &R);     //=重载
    char &at(const int &index);                 //at
    char &operator[](const int &index);         //下标重载
    char *data();       //data
    char *c_str();      //c_str
    bool empty();       //判空
    int sszie();        //字符实际长度
    int capcity();      //字符串容量
    void clear();       //清空
    void push_back(const char &s);   //尾插1个字符
    void pop_back();    //尾删1个字符
    void expand();      //二倍扩容
    myString &operator+=(const myString &R); //+=重载
    myString &operator+(const myString &R);
    myString &operator+(const char &R);
    void show();        //展示
};
//=
myString & myString:: operator=(const myString &R)
{
    /*delete [] str;
    size = R.size;
    len = R.len;
    char *newstr = new char[len];
    strcpy(newstr,R.str);
    str = newstr;*/
    size = R.size;
    len = R.len;
    char *newstr = new char[len];
    strcpy(newstr,R.str);
    delete [] str;
    str = newstr;
    return *this;
}
//at
char &myString :: at(const int &index)
{
    if(index > size || index < 0)       //判断是否下标越界
    {
        cout<<"下标越界"<<endl;
        exit(0);
    }
    return str[index];
}

//[]
char &myString::operator[](const int &index)
{
    return str[index];
}
//data
char *myString ::data()
{
    return &str[0];
}
//c_str
char *myString :: c_str()
{
    return str;
}
//empty
bool myString::empty()
{
    return size==0;
}
//ssize
int myString::sszie()
{
    return size;
}
//capcity
int myString::capcity()
{
    return len;
}
//clear
void myString::clear()
{
//    delete [] str;
//    str = new char[size+1];
    memset(str,0,size+1);
}
//show
void myString ::show()
{
//    cout<<size<<endl;
//    cout<<strlen(str)<<endl;
    cout<<str<<endl;
}
//尾插
void myString::push_back(const char &s)
{
    if((size + 1) >= len)       //判断是否需要二倍扩容
    {
        expand();
    }
    str[size] = s;
    size++;
    str[size] = '\0';
}
//尾删一个字符
void myString::pop_back()
{
    str[size-1] = 0;
    size--;
}
//+=
myString & myString::operator+=(const myString &R)
{
    while(size + int(strlen(R.str)) >= len)
    {
        expand();
    }
    strcat(this->str,R.str);
    return *this;
}
//二倍扩容
void myString::expand()
{
    len = len * 2 - 1;
    char*newstr = new char[len];
    memset(newstr,0,len);
    strcpy(newstr,str);
    delete []str;
    str = newstr;
}
//+
myString &myString::operator+(const myString &R)        //两个字符串相加
{
    while((size + R.size) >= len)
    {
        expand();
    }
    strcat(str,R.str);
    size = size + R.size;
    return *this;
}
myString &myString::operator+(const char &R)        //字符串和单个字符相加
{
    if(size + 1 >= len)
    {
        expand();
    }
    push_back(R);
    return *this;
}
int main()
{
    myString s1("nihao");
    myString s2("hello world");
    s1 = s2;
    s1.show();
    cout<<s1.at(1)<<endl;
    s1[0] = 'H';
    s1.show();
    s1.push_back('!');
    s1.show();
    s1.pop_back();
    s1.show();
    myString s3;
    s3 = s1 + s2 + s2;
    s3.show();
    cout<<"**************"<<endl;
    s3 = s3 + '?' + '!';
    s3.show();
    s1.clear();
    s1.show();
    s1.at(-1);
    return 0;
}


http://www.kler.cn/news/290586.html

相关文章:

  • Orcad封装怎么添加
  • (每日一问)基础知识:Java垃圾回收机制详解
  • ES6基础----Promise的使用
  • UPDATE ... JOIN语法
  • 算法复盘——Leetcode hot100:链表160
  • 复变函数在大模型中的应用
  • 静态工厂模式(简单工厂模式)与动态工厂模式(工厂方法模式)
  • excel扒数据到ini文件小工具
  • 实用的4大网站建设模板资源网站
  • 【STM32+HAL库】---- 按键中断控制LED
  • xhr、ajax、axois、fetch的区别
  • echo ‘‘ >>/etc/profile是什么意思什么效果
  • 基于深度学习的水稻病害虫检测设计与实现
  • 设计模式与反模式:UML图示常见误用案例分析
  • 【机器学习】.fit_transform()跟.transform()的区别
  • 基于人工智能的智能客服系统
  • 鸿蒙(API 12 Beta6版)图形【 请求动画绘制帧率】方舟2D图形服务
  • C++基础知识之数组
  • DexclassLoader读取dex在Android14上遇到问题
  • Java SPI机制源码
  • Hive锁表、hive查询表是否被锁、hive解锁表
  • Django+vue自动化测试平台(29)--测试平台集成playwright录制pytest文件执行
  • MVC架构模式
  • Java-线程的生命周期7大状态
  • 读写分离深度解析与MaxScale配置指南
  • 2024嵌入式面试:VIVO嵌入式面试题及参考答案(6万字长文)
  • selenium启动总报错 WebDriverManager总是异常
  • Datawhale X 李宏毅苹果书 AI夏令营 - 跟李宏毅学深度学习(入门之线性模型)
  • XR-Frame 实现 始终朝向屏幕(相机)的面片与模型
  • vue路由Router设置父路由默认选中第一个子路由,切换子路由让父路由激活高亮效果不会消失