C++随手代码收藏 自定义实现 String 类
来源:互联网 发布:软件开发过程控制 编辑:程序博客网 时间:2024/04/28 03:42
#include <iostream.h>#include <string.h>#include <stdlib.h>class String //定义字符串类{ char *ss; //字符串的首地址 int length; //字符串长度public: String(char *s); //带参数的构造函数 String(){ss=0;length=0;} //缺省的构造函数 String(String &s); //拷贝构造函数 String& operator =(String&);//重载赋值运算符“=”(不能用友元函数重载) String& operator =(char *); //重载赋值运算符“=”(不能用友元函数重载) friend String operator +(String &s1,String &s2);//可改用成员函数 friend String operator +(String &s1,char* s2);//可改用成员函数 friend String operator +(char* s1,String &s2); String& operator +=(String&); String& operator +=(char *); friend int operator ==(String &s1,String &s2);//可改用成员函数 friend int operator ==(String &s1,char* s2);//可改用成员函数 friend int operator ==(char* s1,String &s2); friend int operator >(String &s1,String &s2);//可改用成员函数int operator >(String &s2); int operator >(char* s2); friend int operator >(char* s1,String &s2); char& operator [](int); //重载下标运算符“[]”operator char*() //类型转换函数 { return ss; } //有了类型转换函数,某些字符串函数,如:strlen(String),strcpy(char*,String), //strcmp(String,String)、strcmp(String,char*)、strcmp(char*,String), //strcat(char*,String)等等不再需要重载,但strcat(String&,char*)除外 friend void strcat(String& s1,char* s2);//相当于s1+="..." //有了上述重载函数,strcat(String& s1,String& s2)也可执行:由类型转换函数自动将s2转 //换成char*型。strcat(char *s1,...)不需要重载,只要s1有足够的存储空间就行。 friend ostream& operator <<(ostream&,String&); friend istream& operator >>(istream&,String&); String Substr(int index,int count);//从index开始提取count个字符的子串 int Find(char c,int start);//从下标start开始找到c后,返回字符c在本串的下标 int IsEmpty();//判本串是否为空串 void clear();//清本串为空串 void Print(); //字符串的输出函数 ~String() //析构函数 {if (ss) delete []ss;}};String::String(char *s) //带参数的构造函数{ int len=strlen(s); if (len>0) { ss=new char[len+1]; strcpy(ss,s); } else ss=0; length=len;}String::String(String& s)//定义拷贝构造函数{ if (ss) delete[]ss; if (s.length>0) { ss=new char[s.length+1]; strcpy(ss,s.ss); } else ss=0; length=s.length;}String& String::operator =(String& s){//重载“=”运算符 if (ss) delete[] ss; if (s.length>0) { ss=new char[s.length+1]; strcpy(ss,s.ss); } else ss=0; length=s.length; return *this;}void String::Print() //字符串的输出函数{ //cout<<"length="<<length<<",string="; if (length>0) cout<<ss<<endl; else cout<<"<null>"<<endl;}String& String::operator =(char *s){//重载“=”运算符 if (ss) delete[] ss; int len=strlen(s); if (len>0) { ss=new char[len+1]; strcpy(ss,s); } else ss=0; length=len; return *this;}String operator +(String &s1,String &s2){ char *t; int l1,l2; l1=s1.length; l2=s2.length; if (l1+l2>0) { t=new char[l1+l2+1]; if (l1>0) { strcpy(t,s1.ss); if (l2>0) strcat(t,s2.ss); } else //l1=0时,l2>0 strcpy(t,s2.ss); } else t="\0"; return String(t);}String& String::operator +=(String& s){ String temp; temp=*this+s; *this=temp; return *this;}String& String::operator +=(char *s){ String temp; temp=*this+s; *this=temp; return *this;}String operator +(String &s1,char* s2){ char* t; int l1,l2; l1=s1.length; l2=strlen(s2); if (l1+l2>0) { t=new char[l1+l2+1]; if (l1>0) { strcpy(t,s1.ss); if (l2>0) strcat(t,s2); } else strcpy(t,s2); } else t="\0"; return String(t);}String operator +(char* s1,String &s2){ char* t; int l1,l2; l1=strlen(s1); l2=s2.length; if (l1+l2>0) { t=new char[l1+l2+1]; if (l1>0) { strcpy(t,s1); if (l2>0) strcat(t,s2.ss); } else strcpy(t,s2.ss); } else t="\0"; return String(t);}int operator ==(String &s1,String &s2){ if (strcmp(s1.ss,s2.ss)==0) return true; else return false;}int operator ==(String &s1,char* s2){ if (strcmp(s1.ss,s2)==0) return true; else return false;}int operator ==(char* s1,String &s2){ if (strcmp(s1,s2.ss)==0) return true; else return false;}int operator >(String &s1,String &s2){ if (strcmp(s1.ss,s2.ss)>0) return true; else return false;}int String::operator >(char* s2){ if (strcmp(this->ss,s2)>0) return true; else return false;}int operator >(char* s1,String &s2){ if (strcmp(s1,s2.ss)>0) return true; else return false;}char& String::operator [](int n){ if (n<0 || n>=length) { cout<<"下标超界!\n"; exit(0); } return this->ss[n];}ostream& operator <<(ostream &os,String& s){ //友元函数,不能用成员函数 if (s.ss) os<<s.ss; else os<<"<null>"; return os;}istream& operator >>(istream &is,String &s){ //友元函数,不能用成员函数 if (s.ss) delete[] s.ss; char *str=new char[2048]; is>>str int len=strlen(str); if (len>0) { s.ss=new char[len+1]; strcpy(s.ss,str); s.length=len; } else { s.ss=0;s.length=0; } delete[] str; return is;}void strcat(String& s1,char *s2){//友元函数,重载strcat()函数,第一个参数为char*的不需重载 int l1,l2; l1=s1.length; l2=strlen(s2); if (l1+l2>0) { if (l1>0) { char* t; t=new char[l1+1]; strcpy(t,s1.ss); delete []s1.ss; s1.ss=new char[l1+l2+1]; strcpy(s1.ss,t); if (l2>0) strcat(s1.ss,s2); } else //l1=0,l2>0的情况 strcpy(s1.ss,s2); s1.length=l1+l2; } //l1+l2=0时,s1仍为空串,故不需处理}void main( ){ String s1="Nanjing",s2="Shanghai",s3,a("aa"),b("bb"); char str[100]="Computer department,"; cout<<"String s1="<<s1<<endl;//输出字符串s1(重载<<运算符) cout<<"String s2="<<s2<<endl;//输出字符串s2(重载<<运算符) cout<<"String s3="<<s3<<endl; cout<<"String a="<<a<<endl; cout<<"String b="<<b<<endl; s3=s1; //调用operator =(String&),重载“=”运算符 cout<<"执行s3=s1;后,s3="<<s3<<endl; s3="Beijing"; //调用operator =(char*) cout<<"执行s3=\"Beijing\";后,s3="<<s3<<endl; s3+=s2; //operator +=(String&),重载“+=”运算符 cout<<"执行s3+=s2;后,s3="<<s3<<endl; s3=s1+s2; //String+String,重载“+” cout<<"执行s3=s1+s2;后,s3="<<s3<<endl; s3=s1+"Tianjin"; //String+char*,重载“+” cout<<"执行s3=s1+\"Tianjin\"后,s3="<<s3<<endl; s3="Guangzhou"+s2; //char* +String,重载“+” cout<<"执行s3=\"Guangzhou\"+s2;后,s3="<<s3<<endl; s3=a+b; //空String+空String cout<<"执行s3=a+b;后,s3="<<s3<<endl; s3+="Public"; cout<<"接着执行s3+=\"Public\";后,s3="<<s3<<endl; cout<<"测试String==String功能:"; if (s1==s3) //operator ==(String,String),重载“==” cout<<s1<<'='<<s3<<endl; else cout<<s1<<"!="<<s3<<endl; cout<<"测试String==char*功能:"; if (s3=="Public") //operator ==(String,char*),重载“==” cout<<s3<<'='<<"Public"<<endl; else cout<<s3<<"!="<<"Public"<<endl; cout<<"测试char*==String功能:"; if ("Public1"==s3) //operator ==(char*,String),重载“==” cout<<s3<<'='<<"Public1"<<endl; else cout<<s3<<"!="<<"Public1"<<endl; char *sa="WuHan"; cout<<"测试String>char*功能:"; if (s2>sa) //operator >(String,String),重载“>” cout<<s2<<'>'<<sa<<endl; else cout<<s2<<"<="<<sa<<endl; cout<<"测试String>String功能:"; if (s2>s3) //operator >(String,String),重载“>” cout<<s2<<'>'<<s3<<endl; else cout<<s2<<"<="<<s3<<endl; cout<<"测试char*>String功能:"; if (sa>s3) //operator >(String,String),重载“>” cout<<sa<<'>'<<s3<<endl; else cout<<sa<<"<="<<s3<<endl; cout<<"strlen(s1)="<<strlen(s1)<<endl; //有了类型转换函数,字符串处 cout<<"strcmp(s1,s2)="<<strcmp(s1,s2)<<endl;//理函数不用重载就可直接使用 strcat(s1," University"); //调用重载函数strcat(String,char*) cout<<"执行strcat(s1,\" University\");后,s1="<<s1<<endl; strcat(s2,s3); //调用重载函数strcat(String,char*):自动将s3转换成char*类型 cout<<"执行strcat(s2,s3);后,s2="<<s2<<endl; s2.Print(); cout<<"str="<<str<<endl; strcat(str,s1); //调用库函数strcat(char*,char*):自动将s1转换成char*类型 cout<<"执行strcat(str,s1);后,str="<<str<<endl; cout<<"测试提取运算符“>>”,请输入一串字符:";cin>>s3; //重载“>>”运算符 cout<<"输入的字符串是:"<<s3<<endl; cout<<"输入的字符串长度是:"<<strlen(s3)<<endl; cout<<"测试下标运算符:\n"; cout<<"s3中下标为2的字符为:"<<s3[2]<<endl; s3[2]='A'; cout<<"执行s3[2]='A'后,s3变为:"<<s3<<endl;}
- C++随手代码收藏 自定义实现 String 类
- 自定义实现String类
- 实现自定义string类
- 简单实现自定义View随手指拖动
- 自定义view实现随手移动的圆球
- 【C/C++】String类实现
- C++【拷贝构造】和【拷贝赋值】(实现自定义的string类)
- [C++]String类的实现
- [C++]String类的实现
- [C++]String类的实现
- C++String类的实现
- 【c++】string类的实现
- C++string类的实现
- C++:模拟实现string类
- C++string类的实现
- C++String类的实现
- 模拟实现string类(c++)
- C++string类的实现
- Butterfly API注意事项一
- 通过wifi连接android设备的方法
- 25 让大家学会复用
- AS3 HorizontalScroller---- 水平滚动条控件,细节是魔鬼
- poi-2488 A Knight's Journey
- C++随手代码收藏 自定义实现 String 类
- Linux下的段错误产生的原因及调试方法
- js获取mac地址
- PLSQL导入导出数据库
- Linux虚拟机简介
- sqlserver 2005 查看和kill死鎖
- 移植原生Android2.3之 - Camera Preview过程
- 3种地址的介绍
- poj1423