#ifndef _MSTRING_H_
#define _MSTRING_H_
#include <iostream>
using namespace std;
namespace kaka{
class String;
/*
* 输出操作符的重载函数
*/
std::ostream& operator<<(std::ostream &os,const String &a);
/*
* 输出操作符的重载函数
*/
std::istream& operator>>(std::istream &os,String &a);
class String
{
friend std::ostream& operator<<(std::ostream &os,const String &a); //设为友元函数,使它能访问该类的私有成员
friend std::istream& operator>>(std::istream &is,String &a);
public:
String(); //构造函数
~String(); //析构函数
String(const char *str); //构造函数的重载
String(const String &);
String& operator=(const String &str); //等号操作符的重载
String& operator=(const char *str);
char& operator[](int index); //[]操作符的重载
String& operator+=(const String &str); //+=操作符重载函数
String& operator+=(const char *str);
bool operator!=(const String &str); //!=操作符重载
bool operator!=(const char *str);
bool operator>(const char *str);
bool operator>(const String &str); //>操作符重载
bool operator>=(const char *str);
bool operator>=(const String &str); //>=操作符重载
bool operator<(const char *str);
bool operator<(const String &str); //<操作符重载
bool operator<=(const char *str);
bool operator<=(const String &str); //<=操作符重载
bool operator==(const String &str); //==操作副重载
bool operator==(const char *str);
String strcat(const char *str); //string拼接
String strcat(const String &str);
String substring(int index,int number);//截取子串
String substring(int index);
String strcpy(char *str); //string复制
String strcpy(String src);
char* getstring();
inline bool isempty()
{
if(*_string=='\0')
return true;
else
return false;
}
int length();
void clear();
private:
char *_string;
int _length;
};
};
#endif
这是头文件mstring.h的定义
接下来是mstring.cpp实现功能接口
#include "mstring.h"
#include <iostream>
using namespace std;
namespace kaka{
/*
* 输出操作符的重载函数
*/
std::ostream& operator<<(std::ostream &os,const String &a)
{
os<<a._string;
return os;
}
/*
* 输出操作符的重载函数
*/
std::istream& operator>>(std::istream &is,String &a)
{
char temp[255];
is>>temp;
a=temp;
return is;
}
String::String() //构造函数
{
_string=NULL;
_length=0;
}
String::~String() //析构函数
{
if(_string!=NULL)
{
delete[] _string;
_length=0;
}
}
String::String(const char *str) //构造函数的重载
{
int i=0;
_length=0;
while(str[_length]!='\0')
{
_length++;
}
_string=new char[_length+1];
while(str[i]!='\0')
{
_string[i]=str[i];
i++;
}
_string[i+1]='\0';
}
String::String(const String &str)
{
int i=0;
_length=str._length;
_string=new char[_length+1];
while(str._string[i]!='\0')
{
_string[i]=str._string[i];
i++;
}
_string[i+1]='\0';
}
String& String::operator=(const String &str) //等号操作符的重载
{
strcpy(str);
return *this;
}
String& String::operator=(const char *str)
{
strcpy(str);
return *this;
}
char& String::operator[](int index) //[]操作符的重载
{
return _string[index];
}
String& String::operator+=(const String &str) //+=操作符重载函数
{
strcat(str);
return *this;
}
String& String::operator+=(const char *str)
{
strcat(str);
return *this;
}
bool String::operator!=(const String &str) //!=操作符重载
{
if(_length!=str._length) //先比较长度是否相同,若不相等,直接返回true,节省比较时间
return true;
else
{
int i=0;
while(_string[i]!='\0'&&str._string[i]!='\0')
{
if(_string[i]==str._string[i])
continue;
else
return true;
}
return false;
}
}
bool String::operator!=(const char *str)
{
int length=0;
while((*str++)!='\0') //算出str的长度
{
length++;
}
if(_length!=length)
return true;
else
{
int i=0;
while(_string[i]!='\0'&&str[i]!='\0')
{
if(_string[i]==str[i])
continue;
else
return true;
}
return false;
}
}
bool String::operator>(const char *str) //>操作符重载
{
unsigned int i=0;
while(_string[i]!='\0'&&str[i]!='\0')
{
if(_string[i]==str[i])
{
i++;
continue;
}
else if(_string[i]>str[i])
{
return true;
}
else
return false;
}
if(i>=this->length())
return false;
else
return (_string[i]>str[i]);
}
bool String::operator>(const String &str)
{
return (*this>str._string);
}
bool String::operator>=(const char *str) //>=操作符重载
{
unsigned int i=0;
while(_string[i]!='\0'&&str!='\0')
{
if(_string[i]==str[i])
{
i++;
continue;
}
else if(_string[i]>str[i])
{
return true;
}
else
return false;
}
if(_string=='\0'&&str[i]=='\0')
return true;
else
return (_string[i]>str[i]);
}
bool String::operator>=(const String &str)
{
return (*this>=str._string);
}
bool String::operator<(const String &str) //<操作符重载
{
return !(*this>=str._string);
}
bool String::operator<(const char *str)
{
return !(*this>=str);
}
bool String::operator<=(const String &str) //<=操作符重载
{
return !(*this>str._string);
}
bool String::operator<=(const char *str)
{
return !(*this>str);
}
bool String::operator==(const String &str) //==操作副重载
{
if(*this>str)
return false;
else if(*this<str)
return false;
else
return true;
}
bool String::operator==(const char *str)
{
if(*this<str)
return false;
else if(*this<str)
return false;
else
return true;
}
String String::strcat(const char *str) //string拼接
{
int i=0;
char *temp,*s_string;
while(str[i++]!='\0')
{
}
_length=_length+i;
temp=new char[_length+1];
s_string=temp; //保存temp字符串的首地址
i=0;
while(_string[i]!='\0')
{
*temp=_string[i];
temp++;
i++;
}
i=0;
while(str[i]!='\0')
{
*temp=str[i];
temp++;
i++;
}
*temp='\0';
_string=s_string;
return String(s_string);
}
String String::strcat(const String &str)
{
return strcat(str._string);
}
String String::substring(int index,int number)//截取子串
{
char *s_string=new char[number];
int i=0;
int pos=index;
while(i<=number-1)
{
s_string[i++]=_string[pos++];
}
s_string[i]='\0';
return String(s_string);
}
String String::substring(int index)
{
return substring(index,length()-index+1);
}
String String::strcpy(char *str)
{
clear();
int i=0;
while(str[i++]!='\0')
{
}
_string=new char[i+1];
i=0;
while(str[i]!='\0')
{
_string[i]=str[i];
i++;
}
_string[i]='\0';
_length=length();
return *this;
}
String String::strcpy(String str)
{
strcpy(str._string);
return *this;
}
char* String::getstring()
{
return _string;
}
int String::length()
{
int length=0;
while(_string[length]!='\0')
{
length++;
}
return length;
}
void String::clear()
{
if(_string!=NULL)
{
delete[] _string;
_string=NULL;
_length=0;
}
}
};
接下来是测试函数 只是测试了一部分
#include <iostream>
#include <mstring.h>
using namespace std;
using namespace kaka;
int main(void)
{
String a("abcd");
cout<<a<<endl;
a="ffff";
cout<<a<<endl;
cout<<a.length()<<endl;
String b("kkkkss");
a+=b;
cout<<a<<endl;
cout<<a.length()<<endl;
cin>>a;
cout<<a<<endl;
cout<<a.length()<<endl;
return 0;
}
结果如下所示: