Mystring类的定义:
#include<iostream>
using namespace std;
class Mstring
{
private:
int _len;
char* _str;
public:
Mstring();
Mstring(const Mstring& src);
Mstring(const char* str);
~Mstring();
Mstring& operator=(const Mstring& src);
Mstring& operator=(const char* str);
Mstring operator+(const Mstring& src)const;
Mstring operator+(const char* str)const;
bool operator==(const Mstring& src)const;
bool operator==(const char* str)const;
bool operator>(const Mstring& src)const;
bool operator>(const char* str)const;
void operator<<(ostream& out)const;
void operator>>(istream& in);
char& operator*()
{
return *_str;
//*s = 'a';
}
const char& operator*()const
{
return *_str;
//*s = 'a';
}
char& operator[](int sit)
{
return _str[sit];
}
const char& operator[](int sit)const
{
return _str[sit];
}
int size()const
{
return strlen(_str);
}
friend Mstring operator+(const char* str, const Mstring& src);
friend bool operator==(const char* str, const Mstring& src);
friend bool operator>(const char* str, const Mstring& src);
friend ostream& operator<<(ostream& out, const Mstring& src);
friend istream& operator>>(istream& in, Mstring& src);
};
Mstring operator+(const char* str, const Mstring& src);
bool operator==(const char* str, const Mstring& src);
bool operator>(const char* str, const Mstring& src);
ostream& operator<<(ostream& out, const Mstring& src);
istream& operator>>(istream& in, const Mstring& src);
Mystring类的实现:
1、构造和析构
Mstring::Mstring()//默认构造
{
_len = 10; //默认长度为10
_str = new char[_len+1];
memset(_str, 0, _len+1);
}
Mstring::Mstring(const Mstring& src)//拷贝构造
{
_len = src._len;
_str = new char[_len+1];
memset(_str, 0, _len+1);
strcpy_s(_str,_len+1,src._str);
}
Mstring::Mstring(const char* str)//用char*字符串的构造
{
_len = strlen(str);
_str = new char[_len+1];
memset(_str, 0, _len+1);
strcpy_s(_str, _len+1, str);
}
Mstring::~Mstring()//析构
{
delete _str;
_len = 0;
_str = NULL;
}
2、等号运算符的重载
Mstring& Mstring::operator=(const Mstring& src)
{
if (&src == this)
{
return *this;
}
delete _str;
_len = src._len;
_str = new char[_len+1];
memset(_str, 0, _len+1);
strcpy_s(_str, _len+1, src._str);
return *this;
}
Mstring& Mstring::operator=(const char* str)
{
delete _str;
if (str == NULL)
{
_str = NULL;
return *this;
}
_len = strlen(str);
_str = new char[_len+1];
memset(_str, 0, _len+1);
strcpy_s(_str, _len+1,str);
return *this;
}
3、加号运算符的重载
Mstring Mstring::operator+(const Mstring& src)const
{
int len = src.size() + size() + 1;
char* tmp = new char[len];
memset(tmp, 0, len);
strcpy_s(tmp,len,_str);
strcpy_s(tmp + size(),len-size(), src._str);
return tmp;
}
Mstring Mstring::operator+(const char* str)const
{
int len = strlen(str) + size() + 1;
char* tmp = new char[len];
memset(tmp, 0, len);
strcpy_s(tmp,len, _str);
strcpy_s(tmp + size(),len-size(), str);
return tmp;
}
4、比较运算符的重载
bool Mstring::operator==(const Mstring& src)const
{
return strcmp(_str, src._str) == 0;
}
bool Mstring::operator==(const char* str)const
{
return strcmp(_str, str) == 0;
}
bool Mstring::operator>(const Mstring& src)const
{
return strcmp(_str, src._str) == 1;
}
bool Mstring::operator>(const char* str)const
{
return strcmp(_str, str) == 1;
}
5、输入输出运算符的重载
void Mstring::operator<<(ostream& out)const
{
out << _str << endl;
}
void Mstring::operator>>(istream& in)
{
char str[1024];
in >> str;
delete _str;
_len = strlen(str);
_str = new char[_len + 1];
strcpy_s(_str, _len + 1 ,str);
}
6、类外函数的实现:
Mstring operator+(const char* str, const Mstring& src)
{
return Mstring(str) + src;
}
bool operator==(const char* str, const Mstring& src)
{
return Mstring(str) == src;
}
bool operator>(const char* str, const Mstring& src)
{
return Mstring(str) > src;
}
ostream& operator<<(ostream& out, const Mstring& src)
{
out << src._str << endl;
return out;
}
istream& operator>>(istream& in,Mstring& src)
{
char str[1024];
in >> str;
delete src._str;
src._len = strlen(str);
src._str = new char[src._len + 1];
strcpy_s(src._str, src._len + 1, str);
return in;
}