2024.8.29 C++

作业

仿照string类,实现myString

代码

#include <iostream>
#include <cstring>
using namespace std;
//仿照string完成myString类
class myString
{
    private:
        char *str;          //记录c风格的字符串
        int size;            //记录字符串的实际长度
    public:
        //无参构造
        myString():size(10)
        {
            str = new char[size];         //构造出一个长度为10的字符串
        }
        //有参构造
        myString(const char *s):size(strlen(s))            //有参构造     string  s("hello wirld");
        {
               str = new char[size+1];
               strcpy(str,s);
        }
        ~myString()             //定义析构函数,用于释放申请的空间
        {
            delete[] str;
        }
        //判空函数
        bool empty();
        //size函数
        int ssize();
        //c_str函数
        char *c_str();
        //at函数
        char &at(int index);
        void add(const char *s);
        //二倍扩容
        void expand();
};

bool myString::empty()      //判空函数
{
    return size == 0;
}

int myString::ssize()
{
    return size;
}

char *myString::c_str()     //传换成c风格的字符串
{
    return str;
}

char &myString::at(int index)   //返回元素
{
    return str[index];
}

void myString::add(const char *s)   //如果使用的是无参构造函数,需要进行字符串的写入使用该函数
{
    if(strlen(s) > (unsigned)size)  //检测是否默认申请的大小是否可以容纳下写入的字符串
    {
        expand();           //进行二倍扩充
    }
    strcpy(str,s);
}

void myString::expand() //二倍扩充
{
    size = 2 * size;    //默认的size*2
    char *temp = new char[size+1];  //申请一个大小为之前两倍的空间
    strcpy(temp,str);   //将之前的数据放入新的空间内
    char *p = str;      //准备释放原空间
    str = temp;         //原来的指针指向新的空间
    delete []p;         //删除原空间
}

int main()
{
    myString s1("hello world");     //使用有参构造函数并初始化为“hello world”
    s1.at(0) = 'H';             //把“hello world”的第一个元素'h'变成'H'
    printf("%s\n",s1.c_str());  //输出c语言风格的字符串
    cout << "size = " << s1.ssize() << endl;    //输出size,因为用的是有参构造函数,所以他的size就是字符串的大小

    myString s2;        //使用无参构造函数,初始默认的size为10
    s2.add("hello world");    //写入"hello world"
    printf("%s\n",s2.c_str());  //输出c语言风格的字符串
    cout << "size " << s2.ssize();  //输出size,因为"hello world"的大小是11,所以会进行二倍扩充,size就变成了20,字符串的长度是21
    return 0;
}

效果图

 

思维导图

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值