惊落一身雪 发表于 2024-8-30 04:46:13

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;         //构造出一个长度为10的字符串
      }
      //有参构造
      myString(const char *s):size(strlen(s))            //有参构造   strings("hello wirld");
      {
               str = new char;
               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;
}

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;//申请一个大小为之前两倍的空间
    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;
}
效果图

 https://i-blog.csdnimg.cn/direct/f042f78783db4ac4a3e37d9f46e89577.png

头脑导图

https://i-blog.csdnimg.cn/direct/b0459161ecd84cd190796609c7628929.jpeg

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 2024.8.29 C++