2024.8.29 C++

打印 上一主题 下一主题

主题 537|帖子 537|积分 1611

作业

仿照string类,实现myString

代码

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. //仿照string完成myString类
  5. class myString
  6. {
  7.     private:
  8.         char *str;          //记录c风格的字符串
  9.         int size;            //记录字符串的实际长度
  10.     public:
  11.         //无参构造
  12.         myString():size(10)
  13.         {
  14.             str = new char[size];         //构造出一个长度为10的字符串
  15.         }
  16.         //有参构造
  17.         myString(const char *s):size(strlen(s))            //有参构造     string  s("hello wirld");
  18.         {
  19.                str = new char[size+1];
  20.                strcpy(str,s);
  21.         }
  22.         ~myString()             //定义析构函数,用于释放申请的空间
  23.         {
  24.             delete[] str;
  25.         }
  26.         //判空函数
  27.         bool empty();
  28.         //size函数
  29.         int ssize();
  30.         //c_str函数
  31.         char *c_str();
  32.         //at函数
  33.         char &at(int index);
  34.         void add(const char *s);
  35.         //二倍扩容
  36.         void expand();
  37. };
  38. bool myString::empty()      //判空函数
  39. {
  40.     return size == 0;
  41. }
  42. int myString::ssize()
  43. {
  44.     return size;
  45. }
  46. char *myString::c_str()     //传换成c风格的字符串
  47. {
  48.     return str;
  49. }
  50. char &myString::at(int index)   //返回元素
  51. {
  52.     return str[index];
  53. }
  54. void myString::add(const char *s)   //如果使用的是无参构造函数,需要进行字符串的写入使用该函数
  55. {
  56.     if(strlen(s) > (unsigned)size)  //检测是否默认申请的大小是否可以容纳下写入的字符串
  57.     {
  58.         expand();           //进行二倍扩充
  59.     }
  60.     strcpy(str,s);
  61. }
  62. void myString::expand() //二倍扩充
  63. {
  64.     size = 2 * size;    //默认的size*2
  65.     char *temp = new char[size+1];  //申请一个大小为之前两倍的空间
  66.     strcpy(temp,str);   //将之前的数据放入新的空间内
  67.     char *p = str;      //准备释放原空间
  68.     str = temp;         //原来的指针指向新的空间
  69.     delete []p;         //删除原空间
  70. }
  71. int main()
  72. {
  73.     myString s1("hello world");     //使用有参构造函数并初始化为“hello world”
  74.     s1.at(0) = 'H';             //把“hello world”的第一个元素'h'变成'H'
  75.     printf("%s\n",s1.c_str());  //输出c语言风格的字符串
  76.     cout << "size = " << s1.ssize() << endl;    //输出size,因为用的是有参构造函数,所以他的size就是字符串的大小
  77.     myString s2;        //使用无参构造函数,初始默认的size为10
  78.     s2.add("hello world");    //写入"hello world"
  79.     printf("%s\n",s2.c_str());  //输出c语言风格的字符串
  80.     cout << "size " << s2.ssize();  //输出size,因为"hello world"的大小是11,所以会进行二倍扩充,size就变成了20,字符串的长度是21
  81.     return 0;
  82. }
复制代码
效果图

 


头脑导图



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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表