自己实现的一个string类,包括基本构造,复制构造,赋值和析构函数,比较函数,输入输出函数,锻炼一下动手能力。
#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;
class MyString{
public:
MyString(const char *s=NULL);
MyString(const MyString& rhs);
MyString& operator=(const MyString& rhs);
MyString& operator=(const char* s);
~MyString();
char& operator[](int i);
int length() const {return len; }
char *c_str(){return data;}
friend bool operator<(const MyString &st1, const MyString &st2);
friend bool operator>(const MyString &st1, const MyString &st2);
friend bool operator==(const MyString &st1, const MyString &st2);
friend MyString operator+(const MyString &s1, const MyString &s2);
friend ostream& operator<<(ostream &os, const MyString &st);
friend istream& operator>>(istream &is, MyString &st);
private:
char *data;
int len;
};
MyString::MyString(const char *s)
{
if(NULL==s)
{
len=0;
data=new char[1];
*data='\0';
}
else
{
len=strlen(s);
data=new char[len+1];
strcpy(data,s);
}
}
MyString::MyString(const MyString &rhs)
{
len=strlen(rhs.data);
data=new char[len+1];
strcpy(data,rhs.data);
}
MyString& MyString::operator=(const MyString &rhs)
{
if(this==&rhs)
return *this;
delete []data;
len=strlen(rhs.data);
data=new char[len+1];
strcpy(data,rhs.data);
return *this;
}
MyString& MyString::operator=(const char* s)
{
delete []data;
len=strlen(s);
data=new char[len+1];
strcpy(data,s);
return *this;
}
MyString::~MyString()
{
delete []data;
}
char& MyString::operator[](int i)
{
return data[i];
}
//注意友元函数定义时不要friend,而且不要String::
bool operator<(const MyString &st1, const MyString &st2)
{
return (strcmp(st1.data,st2.data)<0);
}
bool operator>(const MyString &st1, const MyString &st2)
{
return (strcmp(st1.data,st2.data)>0);
}
bool operator==(const MyString &st1, const MyString &st2)
{
return (strcmp(st1.data,st2.data)==0);
}
MyString operator+(const MyString &st1, const MyString &st2)
{
MyString res;
res.len=st1.len+st2.len;
res.data=new char[res.len+1];
strcpy(res.data,st1.data);
strcat(res.data,st2.data);
return res;
}
istream &operator>>(istream &cin, MyString &str)
{
const int limit_string_size = 4096;
str.data = new char[limit_string_size];
cin >> setw(limit_string_size) >> str.data;
str.len = strlen(str.data);
return cin;
}
ostream &operator<<(ostream &cout, MyString &str)
{
cout<<str.c_str();
return cout;
}
int main()
{
MyString s1("I am s1.");
MyString s2="Hello,This is s2.";
cout<<s1<<endl;
cout<<s2<<endl;
MyString s3(s1);
cout<<s3<<endl;
s3=s2;
cout<<s3<<endl;
s3="My name is: " + s1;
cout<<s3<<endl;
s3=s1+s2;
cout<<s3<<endl;
return 0;
}