String 类的编写:1.各种运算符的重载 2.用引用计数来实现String类
来源:互联网 发布:mac idea搭建ssh框架 编辑:程序博客网 时间:2024/05/22 03:48
1.各种运算符的重载
/*1.String 类的编写(主要是写运算符+ += - > < >= <=的重载):#include<iostream>using namespace std;class String;ostream& operator<<(ostream &out,const String &s);class String{friend ostream& operator<<(ostream &out,const String &s);public:String(const char *str=""){if(str==NULL){data=new char[1];data[0]='\0';}else{data=new char[strlen(str)+1];strcpy(data,str);}}String(const String &s){data=new char(strlen(s.data)+1);strcpy(data,s.data);}String& operator=(const String &s)//深赋值{if(this!=&s){delete[]data;//1.释放原有空间data=new char[strlen(s.data)+1];//2.开辟新空间strcpy(data,s.data);//3.进行拷贝}return *this;//4.返回*this}~String(){delete[]data;data=NULL;}public:String operator+(const String &s){int len;char *str=NULL;len=strlen(data)+strlen(s.data)+1;str=new char[len];strcpy(str,data);strcat(str,s.data);return String(str);}/*String operator-(const String &s){int i=0;int len;char *str1,*str2;char *str=NULL;str1=data;str2=s.data;len=strlen(data)-strlen(s.data)+1;str=new char[len];while(*str1!='\0'){if(*str1==*str2){str1++;str2++;}else{ str[i++]=*str1; str1++;}}str[len-1]='\0';//必须写,如果不写后面就是乱码return String(str);}String& operator+=(const String &s){char *str;str=new char[strlen(data)+strlen(s.data)+1];strcpy(str,data);delete []data;strcat(str,s.data);data=str;return *this;}bool operator>(const String &s){int n1=strlen(data);int n2=strlen(s.data);if(n1>n2) return true;else if(n1<n2)return false;else{char *str1=data;char *str2=s.data;while(*str1!='\0'&&*str2!='\0'){if(*str1>*str2){return true;}str1++;str2++;}if(*str1=='\0'&&*str2=='\0')return false;}}bool operator<(const String &s){int n1=strlen(data);int n2=strlen(s.data);if(n1<n2) return true;else if(n1>n2)return false;else{char *str1=data;char *str2=s.data;while(*str1!='\0'&&*str2!='\0'){if(*str1<*str2){return true;}str1++;str2++;}if(*str1=='\0'&&*str2=='\0')return false;}}bool operator>=(const String &s){int n1=strlen(data);int n2=strlen(s.data);if(n1>n2) return true;else if(n1<n2)return false;else{char *str1=data;char *str2=s.data;while(*str1!='\0'&&*str2!='\0'&&*str1==*str2){str1++;str2++;}if(*str1=='\0'&&*str2=='\0')return true;else return false;}}bool operator<=(const String &s){int n1=strlen(data);int n2=strlen(s.data);if(n1<n2) return true;else if(n1>n2)return false;else{char *str1=data;char *str2=s.data;while(*str1!='\0'&&*str2!='\0'&&*str1==*str2){str1++;str2++;}if(*str1=='\0'&&*str2=='\0')return true;else return false;}}bool operator==(const String &s){char *str1=data;char *str2=s.data;while(*str1!=NULL&&*str2!=NULL&&*str1==*str2){str1++;str2++;}if(*str1=='\0'&&*str2=='\0')return true;elsereturn false;}bool operator!=(const String &s){char *str1=data;char *str2=s.data;while(*str1!='\0'&&*str2!='\0'&&*str1==*str2){str1++;str2++;}if(*str1=='\0'&&*str2=='\0')return false;elsereturn true;}private:char *data;};int main(){//String s1("abc");//String s2("123");//cout<<"s1+s2="<<s1+s2;String s1("eefe");String s2("fefe");/*if(s1!=s2){cout<<"不相等"<<endl;}else{cout<<"相等"<<endl;}*//*if(s1==s2){cout<<"相等"<<endl;}else{cout<<"不相等"<<endl;}if(s1>s2){cout<<"大于"<<endl;}else{cout<<"不大于"<<endl;}*///cout<<"s1-s2="<<s1-s2;/*if(s1<s2){cout<<"小于"<<endl;}else{cout<<"不小于"<<endl;}*//*if(s1>=s2){cout<<"符合大于等于"<<endl;}elsecout<<"不符合大于等于"<<endl;return 0;*//*if(s1<=s2){cout<<"符合小于等于"<<endl;}else{cout<<"不符合小于等于"<<endl;}s1+=s2;cout<<s1<<endl;}ostream& operator<<(ostream &out,const String &s){out<<s.data;return out;}
2.String 类构造函数,拷贝构造函数,析构函数的调用
#include<iostream>using namespace std;class String;ostream& operator<<(ostream& out,const String &s);class String{friend ostream& operator<<(ostream& out,const String &s);public:String(const char *str=""){if(str==NULL){data=new char[1];data[0]='\0';}else{data=new char[strlen(str)+1];strcpy(data,str);}cout<<"Create String"<<endl;}String(const String &s){data=new char[strlen(s.data)+1];strcpy(data,s.data);cout<<"Copy String"<<endl;}String& operator=(const String &s){if(this!=&s){delete[]data;//深赋值data=new char[strlen(s.data)+1];strcpy(data,s.data);}cout<<"assign String"<<endl;return *this;}~String(){delete[]data;data=NULL;cout<<"delete String"<<endl;}private:char *data;};ostream& operator<<(ostream &out,const String &s){out<<s.data;return out;}void main(){String s1("abc");//Create String delete String//String s2=s1;//Create String Copy String(调拷贝构造函数) delete String delete StringString s2;s2=s1;//Create String Create String assign String delete String delete String(深赋值)}
3.引用计数模型的String 类
#include<iostream>using namespace std;class String;ostream& operator<<(ostream& out,String &s);class String_rep{friend class String;friend ostream& operator<<(ostream& out,String &s);public:String_rep(const char *str=""):use_count(0){if(str==NULL){data=new char[1];data[0]='\0';}else{data=new char[strlen(str)+1];strcpy(data,str);}}String_rep(const String_rep &s);String_rep& operator=(const String_rep &s);~String_rep(){delete[]data;data=NULL;}public:void increment(){++use_count;}void decrement(){if(--use_count==0){delete this;}}private:char *data;int use_count;};ostream& operator<<(ostream& out,String &s);class String{friend ostream& operator<<(ostream& out,String &s);public:String(const char *str=""):rep(new String_rep(str)){rep->increment();}String(const String &s){rep=s.rep;rep->increment();}String& operator=(const String &s){if(this!=&s){rep->decrement();rep=s.rep;rep->increment();}return *this;}~String(){rep->decrement();}public:void upper()//转换大小写函数{String_rep *new_rep=new String_rep(rep->data);rep->decrement();rep=new_rep;new_rep->increment();char *p=rep->data;while(*p!='\0'){*p-=32;++p;}}private:String_rep *rep;};void main(){String s1("abc");String s2=s1;String s3;s3=s2;s1.upper();cout<<"s1="<<s1<<endl;cout<<"s2="<<s2<<endl;cout<<"s3="<<s3<<endl;}ostream& operator<<(ostream& out,String &s){out<<s.rep->data;return out;}
0 0
- String 类的编写:1.各种运算符的重载 2.用引用计数来实现String类
- 十九、运算符重载(三)String类的改进实现、[]运算符重载、+运算符重载、+=运算符重载、<<运算符重载、>>运算符重载
- 类string运算符的重载
- string类的运算符重载
- 引用计数型String类的简单实现
- String类引用计数的浅拷贝
- c++实现String类(构造函数,析构函数,复制构造函数,各类运算符重载函数的编写)
- 自定义的精简版String类,重载了各种字符串的运算符操作
- string类中运算符重载实现
- String各类运算符重载的编写示例
- 【String】引用计数实现String
- stl::string的引用计数
- stl::string的引用计数
- 第八周--运算符重载-String类的构造
- [c++]String字符串类的运算符重载
- 第十二周项目四 string类的运算符重载
- 【转】【复】string类的运算符重载
- 设计一个string类,通过重载“+=”运算符,实现对两个string类对象m1,m2的操作。
- volley框架的解读
- jquery查找元素,绑定事件,DOM操作
- Android 名企面试题及涉及知识点整理
- Android6.0 CTS测试环境搭建
- spring学习随笔2
- String 类的编写:1.各种运算符的重载 2.用引用计数来实现String类
- 深度学习:正则化方法
- StringUtils中 isNotEmpty 和isNotBlank的区别
- 安卓使用线程池2
- 2.14.1
- expreiment to see what a callback function should be When executing a query
- Java数据类型中String、Integer、int相互间的转换
- js动态加载元素的事件响应--jquery解决
- 如何快速赚钱:Python爬虫