C++--String类型各种重载函数的实现
来源:互联网 发布:程序员常用的工具 编辑:程序博客网 时间:2024/06/05 23:07
#include <iostream>#include <string.h>#include <string>#include <stdio.h>using namespace std;class String{ friend bool operator == (const String &,const String &); friend bool operator != (const String &,const String &); friend bool operator < (const String &,const String &); friend bool operator > (const String &,const String &); friend bool operator <= (const String &,const String &); friend bool operator >= (const String &,const String &); friend ostream &operator <<(ostream &os,const String &s); friend istream &operator >>(istream &os,String &s);public: //无参构造函数 String() { pstr_=new char[1]; } //有参构造函数 String (const char *s) { pstr_=new char[strlen(s)+1]; strcpy(pstr_,s); } //复制构造函数 String (const String &rhs) { pstr_=new char[strlen(rhs.pstr_)+1]; strcpy(pstr_,rhs.pstr_); } //赋值对象重载函数 String &operator = (const String &rhs) { if(this!=&rhs)//如果不是自复制 { delete []pstr_;//先删除掉原有的内容 pstr_=new char[strlen(rhs.pstr_)+1]; strcpy(pstr_,rhs.pstr_); } return *this; } //赋值字符串重载函数 String &operator = (const char *s) { pstr_=new char[strlen(s)+1]; strcpy(pstr_,s); return *this; } //重载+=运算符 左边对象本身发生了改变 String & operator +=(const String & rhs) { //用临时的字符串指针存放 char *tmp; tmp=new char[strlen(pstr_)+strlen(rhs.pstr_)+1]; strcpy(tmp,pstr_); strcat(tmp,rhs.pstr_); delete []pstr_; pstr_=tmp; return *this; } String &operator += (const char *pstr) { char *tmp; tmp = new char[strlen(pstr_)+strlen(pstr)+1];//先开空间 strcpy(tmp,pstr_); strcat(tmp,pstr); delete []pstr_; pstr_=tmp; return *this; } //重载[]下标运算符 char &operator[](size_t index) { static char sNULL='\0'; //要判断给出的下标越界的情况 if(index<strlen(pstr_) && index>0) { return pstr_[index]; } else { cout<<"下标越界"<<endl; return sNULL; } } //重载const对象的运算符 const char &operator[](size_t index) const { static char sNULL='\0'; //要判断给出的下标越界的情况 if(index<strlen(pstr_) && index>0) { return pstr_[index]; } else { cout<<"下标越界"<<endl; return sNULL; } } //返回字符串长度函数 函数后面加const代表这里面的所有变量只能读不能改 size_t size() const { return strlen(pstr_); } //重载c_str函数 返回的是当前字符串的首字符地址 const char* c_str()const { return pstr_; } //析构函数 ~String() { delete []pstr_; } //打印函数 void print() { if(pstr_==NULL) { cout<<""<<endl; } else { cout<<"string :"<<pstr_<<endl; } }private: char *pstr_;};//重载== 函数bool operator == (const String &lhs,const String &rhs){ if(strcmp(lhs.pstr_,rhs.pstr_)==0) { return 1; } else { return 0; }}//重载!=函数bool operator != (const String &lhs,const String &rhs){ if(strcmp(lhs.pstr_,rhs.pstr_)==0) { return 0; } else { return 1; }}//重载< 函数bool operator <(const String &lhs,const String &rhs){ if(strcmp(lhs.pstr_,rhs.pstr_)<0) { return 1; } else { return 0; }}//重载>函数bool operator >(const String &lhs,const String &rhs){ if(strcmp(lhs.pstr_,rhs.pstr_)>0) { return 1; } else { return 0; }}//重载<=函数bool operator <=(const String &lhs,const String &rhs){ if(strcmp(lhs.pstr_,rhs.pstr_)<=0) { return 1; } else { return 0; }}//重载>=函数bool operator >=(const String &lhs,const String &rhs){ if(strcmp(lhs.pstr_,rhs.pstr_)>=0) { return 1; } else { return 0; }}//重载<<流ostream &operator <<(ostream &ofs,const String &rhs){ ofs<<rhs.pstr_<<endl; return ofs;}//重载>>流istream &operator >>(istream &ifs, String &rhs){ char tmp[1024];//先开空间 ifs>>tmp; rhs.pstr_=tmp;//输入的字符 放到rhs中 return ifs;}//重载+(两个对象之间)String operator +(const String &lhs,const String & rhs){ String str(lhs); str+=rhs; return str;}String operator +(const String &lhs,const char *s){ String str(lhs); str+=s; return str;}String operator +(const char *s,const String &rhs){ String str(rhs); str+=s; return s;}int main(){ String s1;//无参函数 s1.print(); String s2="hello";//有参函数 s2.print(); String s3=s2;//调用复制构造函数 s3.print(); String s4="world";//赋值对象重载函数 s4=s2; s4.print(); String s5; //赋值字符串重载函数 s5="hello"; s5.print(); String s6="hello";//重载+=函数 String s7="world"; s6+=s7; s6.print(); String s8="hello";//重载++函数 s8+="world"; s8.print(); s8[3]='A'; cout<<s8[3]<<endl;//重载[]运算符 s8.print(); String s9="hello";//重载c_str函数 const char* s; s=s9.c_str(); cout<<s<<endl; String s10="hello"; if(s9==s10) //重载== { cout<<"equal"<<endl; } String s11="world"; if(s10!=s11) //重载!= { cout<<"unequal"<<endl; } String s12="i am the max string";//重载< if(s11<s12) { cout<<"右边字符串大"<<endl; } else { cout<<"左边字符串大"<<endl; } String s13="hello";//重载<< cout<<s13; String s14;//重载>> cin>>s14; cout<<s14; String s15="hello";//重载+ 用到了+= String s16="world"; cout<<s15+s16<<endl; return 0;}
0 0
- C++--String类型各种重载函数的实现
- C++--String类型各种重载函数的实现
- string类型的各种构造函数
- c函数重载的实现
- C++string类型成员函数实现
- string函数的各种实现方式
- 如何实现 C 的函数重载
- C语言是实现函数的重载
- C函数的模拟重载实现说明
- installshield STRING类型的trim函数实现
- 参数类型不同的函数重载(C++)
- 实现string的默认构造函数,拷贝函数,c型字符串参数的构造函数,赋值构造函数,析构函数,重载输出操作符,测试
- c++ string 函数的重载
- 【C++】函数的重载
- 【c++】函数的重载
- 【c++】实现一个函数重载
- C语言实现函数重载
- c plus plus的string函数实现
- windows内核研究
- 三、快速学习创建版本库、管理修改、查看状态、分支、标签、变基、克隆远程版本库
- PopupWindow setOutsideTouchable 问题
- MySQL数据表的CRUD(増、删、改、查)操作
- Android: mediaplayer went away with unhandled events
- C++--String类型各种重载函数的实现
- the constructor AlertDialog.Builder(new View.OnClickListener() ) is undefined
- OC学习----可变数组与不可变数组
- Monkey常用命令详解
- Window及document对象
- 正则表达式30分钟入门教程
- 面试题—— 从尾到头打印链表
- 4pda.ru注册验证的解码算法
- C++ 字符串