#include"MyString.h"
#include<string>
#pragma warning(disable:4996)
int MyString::Total = 0;
//默认的构造函数,完成对象的初始化
MyString::MyString()
{
Total++;
m_buf = new char('\0');
m_len = 0;
}
//构造函数,对象的初始化
MyString::MyString(const char * p)//没有返回值
{
Total++;
if (NULL == p)
{
m_len = 0;
m_buf = new char('\0');
}
else
{
m_len = strlen(p);
m_buf = new char[m_len + 1];
strcpy(m_buf, p);
}
}
//复制构造函数
MyString::MyString(const MyString & str)
{
Total++;
if (&str == NULL)
{
m_buf = NULL;
}
else
{
m_len = str.m_len;
m_buf = new char[m_len + 1];
strcpy(m_buf, str.m_buf);
}
}
//重载赋值运算符
MyString & MyString::operator=(const MyString & str)
{
this->set_string(str.m_buf);
return *this;
}
//重载加号运算符
MyString MyString::operator+(const MyString & str)
{
MyString temp(*this);//调用复制构造函数
temp.append(str);
return temp;
//上面的代码不知道为什么不能正确运行
/*MyString temp;
temp.m_len = m_len + str.m_len;
temp.m_buf = new char[temp.m_len+1];
strcpy(temp.m_buf, m_buf);
strcat(temp.m_buf, str.m_buf);
return temp;*/
// TODO: 在此处插入 return 语句
}
//重载下标运算符
char & MyString::operator[](const int i)
{
if (i < 0 || i >= m_len)
{
cout << "下标访问越界。" << endl;
exit(1);
}
return m_buf[i];
// TODO: 在此处插入 return 语句
}
//重载函数调用运算符
//将参数p指向的字符串赋给对象
MyString & MyString::operator()(const char * p)
{
set_string(p);
m_len = strlen(p);
return *this;
// TODO: 在此处插入 return 语句
}
bool MyString::operator<(const MyString & str)
{
if (strcmp(m_buf, str.m_buf) < 0)
{
return true;
}
else
{
return false;
}
}
bool MyString::operator>(const MyString & str)
{
if (strcmp(m_buf, str.m_buf) > 0)
{
return true;
}
else
{
return false;
}
}
bool MyString::operator<=(const MyString & str)
{
if (strcmp(m_buf, str.m_buf) <= 0)
{
return true;
}
else
{
return false;
}
}
bool MyString::operator>=(const MyString & str)
{
if (strcmp(m_buf, str.m_buf) >= 0)
{
return true;
}
else
{
return false;
}
}
//改变字符串
char * MyString::Change_string(const char * p)
{
if (NULL != p)
{
delete[]m_buf;
m_buf = new char[strlen(p) + 1];
strcpy(m_buf, p);
}
else
{
delete[]m_buf;
m_buf = new char('\0');
}
return m_buf;
}
//将p指向的字符串追加到原有的字符串之后
char * MyString::append(const char * p)
{
if (m_buf == NULL)
{
m_buf = new char[strlen(p) + 1];
strcpy(m_buf, p);
}
else
{
char *s = m_buf;
m_buf = new char[strlen(p) + strlen(s) + 1];
strcpy(m_buf, s);
strcat(m_buf, p);
delete[]s;
}
m_len = m_len + strlen(p);
return m_buf;
}
MyString & MyString::append(const MyString & str1)
{
char * p = new char[m_len + str1.m_len + 1];
sprintf(p, "%s%s", m_buf, str1.m_buf);
delete[] m_buf;
m_buf = p;
m_len = strlen(m_buf);
return *this;
}
ofstream & MyString::write(ofstream & o)
{
o << m_len << " " << m_buf;
return o;
// TODO: 在此处插入 return 语句
}
ifstream & MyString::read(ifstream & in)
{
delete[] m_buf;
in >> m_len;
in.get();
m_buf = new char[m_len + 1];
in.read(m_buf, m_len);
m_buf[m_len] = '\0';
return in;
// TODO: 在此处插入 return 语句
}
//析构函数,堆内存回收
MyString::~MyString()
{
Total--;
delete[] m_buf;
}
ostream & operator<<(ostream & o, const MyString & s)
{
o << s.m_len << " " << s.m_buf;
return o;
// TODO: 在此处插入 return 语句
}
ofstream & operator<<(ofstream & o, const MyString & s)
{
o << s.m_len << " " << s.m_buf;
return o;
// TODO: 在此处插入 return 语句
}
ifstream & operator>>(ifstream & in, MyString & str)
{
delete[] str.m_buf;
in >> str.m_len;
in.get();
str.m_buf = new char[str.m_len + 1];
in.read(str.m_buf, str.m_len);
str.m_buf[str.m_len] = '\0';
return in;
// TODO: 在此处插入 return 语句
}