C++语言笔试题:String类的实现
Vivian 2018-06-04 来源 : 阅读 696 评论 0

摘要:作为学习C/C++语言的程序员在笔试中经常被问到的想必就是 当场实现一个string类,可能由于时间关系可能只要求实现构造函数、析构函数、拷贝构造函数等关键部分。希望看完本文对大家学习C++语言有所帮助。

    作为学习C/C++语言的程序员在笔试中经常被问到的想必就是 当场实现一个string类,可能由于时间关系可能只要求实现构造函数、析构函数、拷贝构造函数等关键部分。希望看完本文对大家学习C++语言有所帮助。

    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<datalen;&#43;&#43;i)< pre=""><pre class="brush:java;">    {</pre>
<pre class="brush:java;">        this->data[i]=c;</pre>
<pre class="brush:java;">    }</pre>
<pre class="brush:java;">}</pre>
<pre class="brush:java;">//自定义赋值</pre>
<pre class="brush:java;">MyString &MyString::operator =(const MyString &str)</pre>
<pre class="brush:java;">{</pre>
<pre class="brush:java;">    if(this->dataLen!=NULL)</pre>
<pre class="brush:java;">    {</pre>
<pre class="brush:java;">        delete[] this->data;</pre>
<pre class="brush:java;">        this->data=NULL;</pre>
<pre class="brush:java;">    }</pre>
<pre class="brush:java;">    if(this->data==str.data)</pre>
<pre class="brush:java;">    {</pre>
<pre class="brush:java;">        return *this;</pre>
<pre class="brush:java;">    }</pre>
<pre class="brush:java;">    this->dataLen=str.dataLen;</pre>
<pre class="brush:java;">    this->data=new char[dataLen+1];</pre>
<pre class="brush:java;">    memset(data,0,this->dataLen+1);</pre>
<pre class="brush:java;">    strcpy(this->data,str.data);</pre>
<pre class="brush:java;">    return *this;</pre>
<pre class="brush:java;">}</pre>
<pre class="brush:java;">//拼接字符串</pre>
<pre class="brush:java;">MyString MyString::operator +(const MyString &str)</pre>
<pre class="brush:java;">{</pre>
<pre class="brush:java;">    MyString temp;</pre>
<pre class="brush:java;">    temp.dataLen=this->dataLen+str.dataLen;</pre>
<pre class="brush:java;">    temp.data=new char[temp.dataLen+1];</pre>
<pre class="brush:java;">    memset(temp.data,0,temp.dataLen+1);</pre>
<pre class="brush:java;">    strcpy(temp.data,this->data);</pre>
<pre class="brush:java;">    strcat(temp.data,str.data);</pre>
<pre class="brush:java;">    return temp;</pre>
<pre class="brush:java;">}</pre>
<pre class="brush:java;">MyString MyString::operator +(const char *str)</pre>
<pre class="brush:java;">{</pre>
<pre class="brush:java;">    int size=this->dataLen+strlen(str);</pre>
<pre class="brush:java;">    char *space=new char[size+1];</pre>
<pre class="brush:java;">    memset(space,0,size+1);</pre>
<pre class="brush:java;">    //追加</pre>
<pre class="brush:java;">    strcat(space,this->data);</pre>
<pre class="brush:java;">    strcat(space,str);</pre>
<pre class="brush:java;">    MyString temp;</pre>
<pre class="brush:java;">    temp.dataLen=size;</pre>
<pre class="brush:java;">    if(temp.data!=NULL)</pre>
<pre class="brush:java;">    {</pre>
<pre class="brush:java;">        delete[] temp.data;</pre>
<pre class="brush:java;">        temp.data=NULL;</pre>
<pre class="brush:java;">    }</pre>
<pre class="brush:java;">    strcpy(temp.data,space);</pre>
<pre class="brush:java;">}</pre>
<pre class="brush:java;">//追加字符串</pre>
<pre class="brush:java;">MyString &MyString::operator +=(const MyString &str)</pre>
<pre class="brush:java;">{</pre>
<pre class="brush:java;">    if(str.data==NULL)</pre>
<pre class="brush:java;">        return *this;</pre>
<pre class="brush:java;">    this->dataLen+=str.dataLen;</pre>
<pre class="brush:java;">    char *newData=new char[this->dataLen+1];</pre>
<pre class="brush:java;">    memset(newData,0,this->dataLen+1);</pre>
<pre class="brush:java;">    strcpy(newData,this->data);</pre>
<pre class="brush:java;">    strcat(newData,str.data);</pre>
<pre class="brush:java;">    delete[] data;</pre>
<pre class="brush:java;">    this->data=newData;</pre>
<pre class="brush:java;">    return *this;</pre>
<pre class="brush:java;">}</pre>
<pre class="brush:java;">MyString &MyString::operator +=(const char *str)</pre>
<pre class="brush:java;">{</pre>
<pre class="brush:java;">    if(NULL==str)</pre>
<pre class="brush:java;">        return *this;</pre>
<pre class="brush:java;">    this->dataLen+=strlen(str);</pre>
<pre class="brush:java;">    char *newData=new char[this->dataLen+1];</pre>
<pre class="brush:java;">    memset(newData,0,this->dataLen+1);</pre>
<pre class="brush:java;">    strcpy(newData,this->data);</pre>
<pre class="brush:java;">    strcat(newData,str);</pre>
<pre class="brush:java;">    delete[] data;</pre>
<pre class="brush:java;">    this->data=newData;</pre>
<pre class="brush:java;">    return *this;</pre>
<pre class="brush:java;">}</pre>
<pre class="brush:java;">int MyString::size()</pre>
<pre class="brush:java;">{</pre>
<pre class="brush:java;">   return this->dataLen;</pre>
<pre class="brush:java;">}</pre>
<pre class="brush:java;">bool MyString::operator ==(const MyString &str)</pre>
<pre class="brush:java;">{</pre>
<pre class="brush:java;">    if(this->dataLen!=str.dataLen)</pre>
<pre class="brush:java;">        return false;</pre>
<pre class="brush:java;">    return strcmp(this->data,str.data)?false:true;</pre>
<pre class="brush:java;">}</pre>
<pre class="brush:java;">std::istream&operator >>(std::istream &is,MyString &str)</pre>
<pre class="brush:java;">{</pre>
<pre class="brush:java;">    char temp[1000]={0};</pre>
<pre class="brush:java;">    is>>temp;</pre>
<pre class="brush:java;">    str.dataLen=strlen(temp);</pre>
<pre class="brush:java;">    str.data=new char[str.dataLen];</pre>
<pre class="brush:java;">    strcpy(str.data,temp);</pre>
<pre class="brush:java;">    return is;</pre>
<pre class="brush:java;">}</pre>
<pre class="brush:java;">std::ostream&operator <<(std::ostream &os,MyString &str)</pre>
<pre class="brush:java;">{</pre>
<pre class="brush:java;">    os<<str.data;< pre=""><pre class="brush:java;">    return os;</pre>
<pre class="brush:java;">}</pre>
测试部分,这里只测试了一小部分,有需要的小伙伴可以copy去测
<p>#include <iostream></iostream></p>
<pre class="brush:java;">#include"mystring.h"</pre>
<pre class="brush:java;">using namespace std;</pre>
<pre class="brush:java;"></pre>
<pre class="brush:java;">int main()</pre>
<pre class="brush:java;">{</pre>
<pre class="brush:java;">  MyString str="123";</pre>
<pre class="brush:java;">  MyString str1=str;</pre>
<pre class="brush:java;">  MyString str2("aaa");</pre>
<pre class="brush:java;">  cout<<str1<<endl;< pre=""><pre class="brush:java;">  str1+="1234";</pre>
<pre class="brush:java;">  cout<<str<<endl;< pre=""><pre class="brush:java;">  cout<<str1<<endl;< pre=""><pre class="brush:java;">  cout<<str2<<endl;< pre=""><pre class="brush:java;">  return 0;</pre>
<pre class="brush:java;">}</pre>
<pre class="brush:java;"></pre>
</str2<<endl;<><br>
</pre>
</str1<<endl;<></pre>
</str<<endl;<></pre>
</str1<<endl;<></pre>
</str.data;<></pre>
</datalen;&#43;&#43;i)<>

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @Vivian 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程