欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++笔试题 String类的实现 详细

程序员文章站 2022-10-30 20:50:29
作为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='\0';
    }
    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;
}