c/c++语言开发共享C++笔试题 String类的实现 详细

作为c/c++程序员在笔试中经常被问到的想必就是 当场实现一个string类,可能由于时间关系可能只要求实现构造函数、析构函数、拷贝构造函数等关键部分。 string的实现涉及很多c/c++的基础知

作为c/c++程序员在笔试中经常被问到的想必就是 当场实现一个string类,可能由于时间关系可能只要求实现构造函数、析构函数、拷贝构造函数等关键部分。

string的实现涉及很多c/c++的基础知识,内存控制及异常处理等问题,一个不慎可能就被pass掉,好了不多说 let you look at my code!!

整体类的框架如下:

class mystring

  {
      friend std::istream &operator >>(std::istream &is,mystring &str);  //输入
      friend std::ostream &operator <<(std::ostream &os,mystring &str);  //输出
  public:
      mystring(const char *str=null);    //通用构造函数
      mystring(const mystring &str);     //通用拷贝构造函数
      mystring(int n,char c);            //有参构造函数
      ~mystring();
      //自定义赋值
      mystring &operator=(const mystring &str);
      //拼接字符串
      mystring operator +(const mystring &str);
      mystring operator +(const char*str);
      //追加字符串
      mystring &operator +=(const mystring &str);
      mystring &operator +=(const char *str);
      //判断是否相等
      bool operator ==(const mystring &str);
      //获得字符串
      int size();
  private:
      char *data;        //数据
      int datalen;     //数据长度
  };

实现如下

mystring::mystring(const char *str)

  {
      if(!str)
      {
          datalen=0;
          data=new char[1];
          *data='';
      }
      else
      {
          this->datalen=strlen(str);
          data=new char[datalen+1];
          memset(data,0,datalen+1);
          strcpy(data,str);
      }
  }
  //拷贝构造函数
  mystring::mystring(const mystring &str)
  {
      this->datalen=str.datalen;
      data=new char[this->datalen+1];
      memset(this->data,0,datalen+1);
      strcpy(this->data,str.data);
  }
  //析构函数
  mystring::~mystring()
  {
      if(this->data!=null)
      {
          delete[] this->data;
          this->data=null;
          this->datalen=0;
      }
  }
  mystring::mystring(int n,char c)
  {
      this->datalen=n;
      this->data=new char[datalen+1];
      memset(data,0,datalen+1);
      for(int i=0;i
    {
          this->data[i]=c;
      }
  }
  //自定义赋值
  mystring &mystring::operator =(const mystring &str)
  {
      if(this->datalen!=null)
      {
          delete[] this->data;
          this->data=null;
      }
      if(this->data==str.data)
      {
          return *this;
      }
      this->datalen=str.datalen;
      this->data=new char[datalen+1];
      memset(data,0,this->datalen+1);
      strcpy(this->data,str.data);
      return *this;
  }
  //拼接字符串
  mystring mystring::operator +(const mystring &str)
  {
      mystring temp;
      temp.datalen=this->datalen+str.datalen;
      temp.data=new char[temp.datalen+1];
      memset(temp.data,0,temp.datalen+1);
      strcpy(temp.data,this->data);
      strcat(temp.data,str.data);
      return temp;
  }
  mystring mystring::operator +(const char *str)
  {
      int size=this->datalen+strlen(str);
      char *space=new char[size+1];
      memset(space,0,size+1);
      //追加
      strcat(space,this->data);
      strcat(space,str);
      mystring temp;
      temp.datalen=size;
      if(temp.data!=null)
      {
          delete[] temp.data;
          temp.data=null;
      }
      strcpy(temp.data,space);
  }
  //追加字符串
  mystring &mystring::operator +=(const mystring &str)
  {
      if(str.data==null)
          return *this;
      this->datalen+=str.datalen;
      char *newdata=new char[this->datalen+1];
      memset(newdata,0,this->datalen+1);
      strcpy(newdata,this->data);
      strcat(newdata,str.data);
      delete[] data;
      this->data=newdata;
      return *this;
  }
  mystring &mystring::operator +=(const char *str)
  {
      if(null==str)
          return *this;
      this->datalen+=strlen(str);
      char *newdata=new char[this->datalen+1];
      memset(newdata,0,this->datalen+1);
      strcpy(newdata,this->data);
      strcat(newdata,str);
      delete[] data;
      this->data=newdata;
      return *this;
  }
  int mystring::size()
  {
     return this->datalen;
  }
  bool mystring::operator ==(const mystring &str)
  {
      if(this->datalen!=str.datalen)
          return false;
      return strcmp(this->data,str.data)?false:true;
  }
  std::istream&operator >>(std::istream &is,mystring &str)
  {
      char temp[1000]={0};
      is>>temp;
      str.datalen=strlen(temp);
      str.data=new char[str.datalen];
      strcpy(str.data,temp);
      return is;
  }
  std::ostream&operator <<(std::ostream &os,mystring &str)
  {
      os<
    return os;
  }

测试部分,这里只测试了一小部分,有需要的小伙伴可以copy去测

#include

  #include"mystring.h"
  using namespace std;
  
  int main()
  {
    mystring str="123";
    mystring str1=str;
    mystring str2("aaa");
    cout<
  str1+="1234";
    cout<
  cout<
  cout<
  return 0;
  }
  

<><>
<><> <><> <><> <> <>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/606581.html

(0)
上一篇 2021年5月14日
下一篇 2021年5月14日

精彩推荐