摘要:作为学习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;++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;++i)<>
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号