39、字符串类的创建

历史遗留问题:C语言不支持真正意义上的字符串,C语言用字符数组和一组函数实现字符串操作,C语言不支持自定义类型,因此无法获得字符串类型。

以\0结束就是C语言中的字符串

从c到c++的进化过程引入了自定义类型。在c++中可以通过类完成字符串类型的定义。

问题:c++中的原生类型系统不包含字符串类型。

实现时的注意事项:

无缝实现String对象与char*字符串的互操作,操作符重载函数需要考虑是否支持const版本,通过c语言中的字符串函数实现String的成员函数。

#include<cstring>
#include<cstdlib>
#include "WSstring.h"
#include "Exception.h"
#include < iostream>
using namespace std;
namespace WSlib
{
void String::init(const char* s)
{
m_str=strdup(s);
if(m_str)
{
m_length=strlen(m_str);
}
else
{
THROW_EXCEPTION(NoEnoughMemoryException,"No memory to create string wobject");
}
}
String::String()
{
init("");
}
String::String(const char* s)
{
init(s? s : "");//空指针转换为空字符串
}
String::String(const String& s)
{
init(s.m_str);
}
String::String(char c)
{
char s[]={c, '\0'};
init(s);
}
int String::length()const
{
return m_length;
}
const char* String::str() const
{
return m_str;
}
bool String::operator ==(const String& s) const
{
return (strcmp(m_str,s.m_str)==0);
}
bool String::operator ==(const char* s) const
{
return (strcmp(m_str,s? s:"" )==0);
}
bool String::operator !=(const String& s) const
{
return !(*this==s);
}
bool String::operator !=(const char* s) const
{
return !(*this==s);
}
bool String::operator >(const String& s) const
{
return (strcmp(m_str,s.m_str)>0);
}
bool String::operator >(const char* s) const
{
return (strcmp(m_str,s? s:"")>0);
}
bool String::operator <(const String& s) const
{
return (strcmp(m_str,s.m_str)<0);
}
bool String::operator <(const char* s) const
{
return (strcmp(m_str,s? s:"")<0);
}
bool String::operator >=(const String& s) const
{
return (strcmp(m_str,s.m_str)>=0);
}
bool String::operator >=(const char* s) const
{
return (strcmp(m_str,s? s:"")>=0);
}
bool String::operator <=(const String& s) const
{
return (strcmp(m_str,s.m_str)<=0);
}
bool String::operator <=(const char* s) const
{
return (strcmp(m_str,s? s:"")<=0);
}
String String::operator +(const String& s)const
{
return (*this +s.m_str);
}
String String::operator +(const char * s) const
{
String ret;
int len =m_length+strlen(s ? s:"" );
char* str=reinterpret_cast<char*>(malloc(len+1));
if(str)
{
strcpy(str,m_str);
strcat(str,s?s:"");
free(ret.m_str);
ret.m_str=str;
ret.m_length=len;
}
else
{


THROW_EXCEPTION(NoEnoughMemoryException,"No memory to create string wobject");
}
return ret;
}
String& String::operator +=(const String& s)
{
return (*this=*this+s.m_str);
}
String& String::operator +=(const char* s)
{
return (*this=*this+s);
}
String& String::operator =(const String& s)
{
return (*this=s.m_str);
}
String& String::operator =(const char* s)
{
if(m_str !=s)
{
char* str=strdup(s?s:"");
if(str)
{
free(m_str);
m_str=str;
m_length=strlen(m_str);
}
else
{
THROW_EXCEPTION(NoEnoughMemoryException,"No memory to create string wobject");
}
}
return *this;
}
String& String::operator =(char c)
{
char s[]={c,'\0'};
return(*this=s);
}
String::~String()
{
free(m_str);
}
}
/*******************************************************************
#include <iostream>
#include "WSstring.h"
using namespace std;
using namespace WSlib;
void test_1()
{
cout<<"test_1"<<endl;
String s;
s='D';
cout<<s.str()<<endl;
cout<<s.length()<<endl;
cout<<(s=="D")<<endl;
cout<<(s>"ccc")<<endl;


s +="dsaf";
cout<<s.str()<<endl;
cout<<s.length()<<endl;


}
void test_2()
{
String a[]={"x","d","s","b","h"};
String min=a[0];
for(int i=0;i<5;i++)
{
if(min>a[i])
{
min=a[i];
}
}
cout<<min.str()<<endl;


}
int main()
{
test_1();
test_2();
return 0;
}

**********************************************************/

小结:c/c++语言本身不支持字符串类型,C语言通过字符数组和一组函数支持字符串操作,c++通过自定义字符串类型支持字符串操作,字符串类型通过C语言中的字符串函数实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值