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

类中的特殊内容

仿照string类,自己手动实现 My_string

#include <iostream>
#include <string.h>
using namespace std;

class My_string
{
private:
    int len;
    int size;
    char *ptr;
public:
    My_string():size(15),len(0)
    {
        ptr=new char[size];
        ptr[0]='\0';
    }
    My_string(const char *src)
    {
        len = strlen(src);
        ptr = new char[len+1];
        strcpy(ptr,src);
    }
    My_string(const My_string& other):ptr(new char[this->len]),len(other.len)
    {
        len = other.len;
        size = other.size;
        ptr = new char[size];
        strcpy(ptr,other.ptr);
    }
    //拷贝赋值
    My_string& operator=(const My_string& other)
    {
        if(this!=&other)
        {
            delete[]ptr;
            len = other.len;
            size = other.size;
            ptr = new char[size];
            strcpy(ptr,other.ptr);
        }
        return *this;
    }
    //析构函数
    ~My_string()
    {
        delete[]ptr;
    }
    //判空
    bool empty()
    {
        return this->len==0;
    }
    //尾插
    void push_back(char x)
    {
        if(this->len==this->size-1)
        {
            return ;
        }
        this->ptr[len++]=x;
    }
    //尾删
    void dele_back()
    {
        if(this->len==0)
        {
            return ;
        }
        this->ptr[len-1]=this->ptr[len];
        this->len--;
    }
    //at函数实现
    char &at(int x)
    {
        if(x>=0&&x<size)
        {
            return ptr[x];
        }else
        {
            cout<<"超出范围"<<endl;
            exit(1);
        }
    }
    //清空函数
    void dele_empty()
    {
        for(int i=0;i<this->len;i++)
        {
            dele_back();
        }
    }
    //返回C风格字符串
    char *my_ptr()
    {
        return this->ptr;
    }
    //返回实际长度
    int my_len()
    {
        return this->len;
    }
    //返回当前最大容量
    int my_size()
    {
        return this->size;
    }
    //二倍扩容
    void doubledilatation()
    {
        //char *ptr1=new char[size];
        //*ptr1=*this->ptr;
       // if(this->len==this->size)
       // {
      //      this->size*=2;
       // }
       // cout <<" len="<<len<<"   size="<<size<<endl;

        size *= 2;
        char *new_ptr = new char[size];
        strcpy(new_ptr, ptr);
        delete[] ptr;
        ptr = new_ptr;
    }
    void show()
    {
        cout <<"len="<<len<<"    size="<<size<<"   ptr="<<ptr<<endl;
    }
};

int main()
{
    My_string s1;
    My_string s2("lili");
    My_string s3("lililyq");
    My_string s4(s2);
    My_string s5(s2);
    s2.push_back('y');
    s2.show();
    s2.dele_back();
    s2.show();
    cout<<"第一个字符:"<<s2.at(2)<<endl;
    cout<<s2.my_ptr()<<endl;
    cout<<s2.my_len()<<endl;
    cout<<s2.my_size()<<endl;
    //while(1)
   // {
    //    s2.doubledilatation();
    //}
    return 0;
}


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

相关文章:

  • 高效高质量SCI论文撰写及投稿
  • 聊聊AUTOSAR:基于Vector MICROSAR的TC8测试开发方案
  • 使用SpringCloud构建可伸缩的微服务架构
  • Matplotlib在运维开发中的应用
  • Java设计模式—面向对象设计原则(六) ----->合成复用原则(CRP) (完整详解,附有代码+案例)
  • MySQL篇(事务 - 基础)
  • 华为高级交换技术笔记 2024-2025
  • 【小白向】怎么去除视频水印?HitPaw帮你轻松解决
  • springboot系列--web相关知识探索一
  • GUI编程之MATLAB入门详解(01)
  • git删除本地+远程提交记录
  • Android IME输入法启动显示隐藏流程梳理
  • Java工厂模式
  • Qt系统相关——QThread
  • 代码随想录冲冲冲 Day53 图论Part5
  • C++基础知识7 list
  • CF1494F Delete The Edges 题解
  • Java代码调用https(SSL证书验证问题)
  • 828华为云征文 | 将Vue项目部署到Flexus云服务器X实例并实现公网访问
  • 使用Conda配置python环境到Pycharm------Window小白版
  • SVN泄露 CTFHUB 解题笔记
  • 论文不会写快来看!分享4款ai改写论文软件
  • uni-app快速入门
  • 异常值理解
  • 尚品汇-秒杀商品定时任务存入缓存、Redis发布订阅实现状态位(五十一)
  • 修复 blender 中文输入 BUG (linux/wayland/GNOME/ibus)
  • 如何降低H5商城系统的开发成本
  • unixODBC编程(一)安装配置ODBC
  • 【STL】vector 基础,应用与操作
  • Java综合练习题—TCP通信协议+xml操作+序列化反序列化综合题