#include<iostream.h>
#include<stdlib.h>
#include<string.h>
#include"Strclass.h"
//出错报告函数
void String::Error(int errorType, int badIndex) const
{
if (errorType == outOfMemory)
cerr << "Memory exhausted!" << endl;
else
cerr << "Index " << badIndex
<< " out of range" << endl;
exit(1);
}
//带默认形参的构造函数
String::String(char *s)
{
size=strlen(s);//*s的长度,不计算'\0'在内
str=new char[size+1];//需要开辟size+1个空间,因为还要存放'\0'
if(str==null)
Error(outOfMemory);
char *srcptr=s;//用临时指针做复制,不改变原来指针str和s的位置
char *desptr=str;
for(int i=0;i<size+1;i++)//共复制size+1次,把'\0'也复制过去
*desptr++ = *srcptr++;
}
//拷贝构造函数
String::String(const String& s)
{
size=s.Length();//size值为串s的长度,'\0'也计算在内
str=new char[size+1];//这里也得开辟size+1个空间
if(str==null)
Error(outOfMemory);
char *srcptr=s.str;
char *desptr=str;
for(int i=0;i<size+1;i++)
*desptr++ = *srcptr++;
}
//析构函数
String::~String(void)
{
delete [] str;
}
//重载赋值运算符,String=String
String& String::operator= (const String& s)
{
int flag=0;
int n=s.Length();//源串s的长度
if(size<n)//若目的串的长度小于源串的长度,删除原有存储空间,重新分配和源串相同大小的存储空间
{
delete [] str;
str=new char[n+1];
if(str==null)
Error(outOfMemory);
size=n;
flag=1;//用flag区分,因为若目的串小于原串,最后还得赋值'\0'
}
char *srcptr=(char *)s;//利用重载的指针转换运算符char *,也可以直接用s.str(直接访问私有成员?),不知道为什么
char *desptr=str;
for(int i=0;i<n;i++)
*desptr++ = *srcptr++;
if(flag==1)//若目的串小于源串,最后把'\0'放进去
*desptr='\0';
return(*this);
}
//重载赋值运算符,String=C++String
String& String::operator = (char *s)
{
int flag=0;
int n=strlen(s);//源串s的长度
if(size<n)//若目的串的长度小于源串的长度,删除原有存储空间,重新分配和源串相同大小的存储空间
{
delete [] str;
str=new char[n+1];
if(str==null)
Error(outOfMemory);
size=n;
flag=1;//用flag区分,因为若目的串小于原串,最后还得赋值'\0'
}
char *srcptr=s;
char *desptr=str;
for(int i=0;i<n;i++)
*desptr++ = *srcptr++;
if(flag==1)//若目的串小于源串,最后把'\0'放进去
*desptr='\0';
return(*this);
}
//重载运算符"==",string==String
int String::operator== (const String& s) const
{
if(size!=s.Length())//先比较大小
return(0);
char *sptr=(char *)s;
for(int i=0;i<size;i++)
if(*str!=*sptr)
return(0);
return(1);
}
//重载运算符"==",String==C++String
int String::operator== (char *s) const
{
if(size!=strlen(s))//先比较大小
return(0);
char *sptr=s;
for(int i=0;i<size;i++)
if(*str!=*sptr)
return(0);
return(1);
}
//重载运算符"=="为友元函数,C++String==String
int operator== (char *str, const String& s)
{
if(strlen(str)!=s.Length())//先比较大小
return(0);
char *sptr1=str;
char *sptr2=(char *)s;
for(int i=0;i<strlen(str);i++)
if(*sptr1!=*sptr2)
return(0);
return(1);
}
//重载运算符"!=",string==String
int String::operator!= (const String& s) const
{
if(size!=s.Length())//先比较大小
return(1);
char *sptr=(char *)s;
for(int i=0;i<size;i++)
if(*str!=*sptr)
return(1);
return(0);
}
//重载运算符"!=",String==C++String
int String::operator!= (char *s) const
{
if(size!=strlen(s))//先比较大小
return(1);
char *sptr=s;
for(int i=0;i<size;i++)
if(*str!=*sptr)
return(1);
return(0);
}
//重载运算符"!="为友元函数,C++String==String
int operator!= (char *str, const String& s)
{
if(strlen(str)!=s.Length())//先比较大小
return(1);
char *sptr1=str;
char *sptr2=(char *)s;
for(int i=0;i<strlen(str);i++)
if(*sptr1!=*sptr2)
return(1);
return(0);
}
//重载运算符"<",String<String
int String::operator< (const String& s) const
{
char *sptr1=str;
char *sptr2=(char *)s;
for(;*sptr1!='\0' && *sptr2!='\0';sptr1++,sptr2++)
if(*sptr1<*sptr2)
return(1);
else if(*sptr1>*sptr2)
return(0);
if(*sptr1=='\0' && *sptr2!='\0')//前面都相同,sptr1串短,所以sptr1小
return(1);
else
return(0);
}
//重载运算符"<",String<C++String
int String::operator< (char *s) const
{
char *sptr1=str;
char *sptr2=s;
for(;*sptr1!='\0' && *sptr2!='\0';sptr1++,sptr2++)
if(*sptr1<*sptr2)
return(1);
else if(*sptr1>*sptr2)
return(0);
if(*sptr1=='\0' && *sptr2!='\0')//前面都相同,sptr1串短,所以sptr1小
return(1);
else
return(0);
}
//重载运算符"<"为友元函数,C++String<String
int operator< (char *str, const String& s)
{
char *sptr1=str;
char *sptr2=(char *)s;
for(;*sptr1!='\0' && *sptr2!='\0';sptr1++,sptr2++)
if(*sptr1<*sptr2)
return(1);
else if(*sptr1>*sptr2)
return(0);
if(*sptr1=='\0' && *sptr2!='\0')//前面都相同,sptr1串短,所以sptr1小
return(1);
else
return(0);
}
//重载运算符"<=",String<=String
int String::operator<= (const String& s) const
{
if(str<s || str==s)
return(1);
else
return(0);
}
//重载运算符"<=",String<=C++String
int String::operator<= (char *s) const
{
if(str<s || str==s)
return(1);
else
return(0);
}
//重载运算符"<="为友元函数,C++String<=String
int operator<= (char *str, const String& s)
{
if(str<s || str==s)
return(1);
else
return(0);
}
//重载运算符">",String>String
int String::operator> (const String& s) const
{
if(str<=s)
return(0);
else
return(1);
}
//重载运算符">",String>C++String
int String::operator> (char *s) const
{
if(str<=s)
return(0);
else
return(1);
}
//重载运算符">"为友元函数,C++String>String
int operator> (char *str, const String& s)
{
if(str<=s)
return(0);
else
return(1);
}
//重载运算符">=",String>=String
int String::operator>= (const String& s) const
{
if(str>s || str==s)
return(1);
else
return(0);
}
//重载运算符">=",String>=C++String
int String::operator>= (char *s) const
{
if(str>s || str==s)
return(1);
else
return(0);
}
//重载运算符">="为友元函数,C++String>=String
int operator>= (char *str, const String& s)
{
if(str>s || str==s)
return(1);
else
return(0);
}
//重载串接运算符"+",String+String
String String::operator+ (const String& s) const
{
int n=size+s.Length();
char *sum=new char[n+1];//多分配一个空间给'\0'
char *desptr=sum;
char *srcptr1=str;
char *srcptr2=(char *)s;
for(int i=0;i<size;i++)//复制本串
*desptr++ = *srcptr1++;
for(i=0;i<s.Length();i++)//复制串s
*desptr++ = *srcptr2++;
*desptr='\0';//最后把'\0'放进去
return String(sum);//返回时创建临时对象,更高效
}
//重载串接运算符"+",String + C++String
String String::operator+ (char *s) const
{
int n=size+strlen(s);
char *sum=new char[n+1];//多分配一个空间给'\0'
char *desptr=sum;
char *srcptr1=str;
char *srcptr2=s;
for(int i=0;i<size;i++)//复制本串
*desptr++ = *srcptr1++;
for(i=0;i<strlen(s);i++)//复制串s
*desptr++ = *srcptr2++;
*desptr='\0';//最后把'\0'放进去
return String(sum);//返回时创建临时对象,更高效
}
//重载串接运算符"+"为友元函数,C++String+String
String operator+ (char *str,const String& s)
{
int n=strlen(str)+s.Length();
char *sum=new char[n+1];//多分配一个空间给'\0'
char *desptr=sum;
char *srcptr1=str;
char *srcptr2=(char *)s;
for(int i=0;i<strlen(str);i++)//复制串str
*desptr++ = *srcptr1++;
for(i=0;i<s.Length();i++)//复制串s
*desptr++ = *srcptr2++;
*desptr='\0';//最后把'\0'放进去
return String(sum);//返回时创建临时对象,更高效
}
//重载串接运算符"+=",String += String
void String::operator+= (const String& s)
{
char *srcptr1=new char[size];//先保存原目的串为srcptr1
for(int i=0;i<size;i++)
*srcptr1++ = *str++;
srcptr1-=size;//srcptr1指针归位
//delete [] str;
str=new char[size+s.Length()+1];//多分配一个空间给'\0'
char *desptr=str;
char *srcptr2=(char *)s;
for(i=0;i<size;i++)
*desptr++ = *srcptr1++;
for(i=0;i<s.Length();i++)
*desptr++ = *srcptr2++;
*desptr='\0';//最后把'\0'放进去
size+=s.Length()