C++ 实现mystring类型
来源:互联网 发布:彗星dns优化器官方 编辑:程序博客网 时间:2024/06/05 04:29
const int MS=100;class mystring{char *str; //存放字符串的数组容器int maxsize; //最大可用元素数,可防止数组出界,提高健壮性int last; //已用元素最大下标public:mystring();mystring(char *s);mystring(mystring & st);~mystring();void show();char & operator[](int i);mystring &operator=(const mystring &);mystring & operator=(char * st);//这里重载的=是把C风格字符串赋给mystringmystring operator+(mystring &);mystring operator+=(mystring &);bool operator<(mystring &);bool operator==(mystring &);};mystring::mystring(){last=0;maxsize =MS;str=new char[last];str[last]=0;cout<<"缺省构造函数"<<endl;}mystring::mystring(char *s)//当C字符串过长,初始化时采用截尾处理{last=0;maxsize =MS;str=new char[strlen(s)+1];//s的长度没有包括\0do{str[last]=s[last];last++;}while(s[last]!='\0'&&last<maxsize-1);str[last] ='\0'; //截尾处理时,必须加串结束符cout<<"构造函数"<<endl;}mystring::mystring(mystring & st){last=0;maxsize =MS;str=new char[st.last+1];//s的长度没有包括\0//重新指向动态内存do{str[last]=st.str[last];last++;}while(st.str[last]!='\0'&&last<maxsize-1);str[last]='\0';cout<<"拷贝构造函数"<<endl;}mystring::~mystring(){delete []str;str=NULL ;cout<<"析构函数"<<endl;}void mystring::show(){//如需重载<<,则请参见9.3.3节,暂时未学到,替代方法是用show()函数cout<<str<<endl;}char & mystring::operator[](int i){ //返回引用,可读可写//if(i>last){cout<<"access violate!";exit(1);}return str[i];}mystring &mystring::operator=(const mystring & st){if(&st==this)return*this;last=st.last;//新的长度delete []str;str=new char[last+1];last=0;do{str[last]=st.str[last];last++;}while(st.str[last]!='\0'&& last<maxsize-1);str[last] ='\0'; //截尾处理时,必须加串结束符return *this;//拷贝的临时变量生命期在调用它的表达式中}mystring & mystring::operator=(char* s){ //这里返回值为引用,不调用拷贝构造函数//delete []str;//这里不能这样??为什么?last=0;str=new char[strlen(s)+1];//s的长度没有包括\0do{str[last]=s[last];last++;}while(s[last]!='\0'&&last<maxsize-1);str[last] ='\0'; //截尾处理时,必须加串结束符return *this;}mystring mystring::operator+(mystring & st){//注意+和+=的不同mystring temp(*this);temp.last=temp.last+st.last;//新的长度delete []temp.str;temp.str=new char[temp.last+1];//申请空间 s的长度没有包括\0temp.last =0;do{temp.str[temp.last]=str[temp.last];temp.last++;}while(str[temp.last]!='\0'&& temp.last<temp.maxsize-1);if(temp.last<temp.maxsize-1){int i=0;do{temp.str[temp.last]=st.str[i];temp.last++;i++;}while(st.str[i]!='\0'&& temp.last<temp.maxsize-1);}temp.str[temp.last] ='\0'; //截尾处理时,必须加串结束符return temp;//拷贝的临时变量生命期在调用它的表达式中}mystring mystring::operator+=(mystring & st){//+=在对象自身进行mystring temp(*this);int i;//保存原来的长度last=last+st.last;//新的长度delete []str;str=new char[last+1];//申请空间 s的长度没有包括\0last=0;do{str[last]=temp.str[last];last++;}while(temp.str[last]!='\0'&& last<maxsize-1);if(last<maxsize-1){i=0;do{str[last]=st.str[i];i++;last++;}while(st.str[i]!='\0'&& last<maxsize-1);}str[last] ='\0'; //截尾处理时,必须加串结束符*/return *this;//拷贝的临时变量生命期在调用它的表达式中}bool mystring::operator<(mystring & st){ //重载<运算符int i=0,k;do{k=str[i]-st.str[i];i++;}while(k==0&&i<last&&i<st.last);if(k<0) return true;if(i==last&&i!=st.last) return true;return false;}bool mystring::operator==(mystring & st){int i=0,k;if(last!=st.last) return false;do{k=str[i]-st.str[i];i++;}while(k==0&&i<last);if(k!=0) return false;else return true;}
int main(){int i=0;char *sp1="sp1",*sp2="sp2",*sp3="sp3",*sp4="sp4";mystring mstr1(sp1);mystring mstr2(sp2);mystring mstr3(sp3);mystring mstr4(mstr3);mystring mstr5=mstr3;mystring mstr6; mstr6=sp4; //ms6赋值是返回引用,不用拷贝构造函数/*cout<<"mstr1: ";mstr1.show();cout<<"mstr2: ";mstr2.show();cout<<"mstr3: ";mstr3.show();cout<<"mstr4: ";mstr4.show();cout<<"mstr5: ";mstr5.show();cout<<"ms6: ";mstr6.show();mstr6=mstr5;cout<<"mstr6=mstr5: ";mstr6.show ();mstr6=mstr1+mstr2;cout<<"mstr6=mstr1+mstr2: ";mstr6.show ();mstr3+=mstr4;cout<<"mstr3+=mstr4: ";mstr3.show ();mstr4=mstr1+mstr2+mstr6;//注意temp和临时变量由拷贝构造函数生成cout<<"mstr4=mstr1+mstr2+mstr6: ";mstr4.show();mstr1+=mstr2+mstr3;cout<<"mstr1+=mstr2+=mstr3: ";mstr1.show();if(mstr1<mstr4) {mstr1.show();cout<<"应排在"<<endl;mstr4.show();cout<<"之前"<<endl;}else {mstr1.show();cout<<"应排在"<<endl;mstr4.show();cout<<"之后"<<endl;}mstr6=mstr1;//mstr6赋值不是返回引用,必须调用拷贝构造函数建立临时对象if(mstr1==mstr6) cout<<"串mstr1与串mstr6相同"<<endl;else cout<<"不相同!"<<endl;mstr1="C++ programming language";*/i=0;while(mstr1[i]!='\0') cout<<mstr1[i++];//读出cout<<endl;mstr1[i++]='.';//写入mstr1.show ();i--;mstr1[i]='\0';mstr1.show();mstr1[i]='k';mstr1.show();return 0;}
0 0
- C++ 实现mystring类型
- mystring实现
- MyString实现
- MyString实现
- MyString的实现
- MyString类实现
- c++实现mystring
- MyString类的实现
- mystring类的实现
- 模拟实现简单Mystring
- 模拟实现MyString
- myString
- MyString
- Mystring
- MyString
- MyString
- 实现MyString类(二)—MyString.cpp实现
- 实现自己的mystring.h
- 有序数组的合并 c++模板实现
- JAVA正则表达式的捕获组、back引用、"$n"
- php 全局变量
- 跑酷入门
- 结合游戏 简单介绍 Material Animator Controller position scale等
- C++ 实现mystring类型
- 【cocos2d-x 2.x 学习与应用总结】11: 理解CCGLProgram
- C++ 自定义日期类实现日期的加减算法
- react native 入门探索
- 在vmwate的CentOS7的虚拟机中安装在rails 4.2.0 版本以后,无法通过其他机器访问 3000端口的问题
- sql:在更新表数据出错(update 。。。。..)
- The application could not be verified
- iOS资源存放问题
- 【深度学习&分布式】Parameter Server 详解