C++笔试题 String类的实现 详细
程序员文章站
2022-05-03 17:57:48
作为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;}