#include
#include
using namespace std;
class MyString
{
private:
char* m_data;
public:
//无参构造
MyString()
{
this->m_data = new char[1];
this->m_data[0] = ‘\0’;
}
//有参构造(通过外部C风格字符串来对类中的属性指针进行初始化。)
MyString(const char* c_str)
{
//1.获得外部字符串的字符的长度。
int len = strlen(c_str);
//2.开辟空间容纳这个长度的C型字符串。
this->m_data = new char[len + 1];
//3.通过内存拷贝的方式来拷贝外部字符串的数据到这个空间中。
//memmove , memcpy
memmove(this->m_data,c_str,len);
//4.结尾处加\0;
this->m_data[len] = ‘\0’;
}
//拷贝构造:
MyString(const MyString& other)
{
int len = strlen(other.m_data);
this->m_data = new char[len + 1];
memmove(this->m_data,other.m_data, len);
this->m_data[len] = ‘\0’;
}
//MyString的析构函数
~MyString()
{
if(m_data != nullptr)
{
delete []m_data;
//好习惯来了。
m_data = nullptr;
}
}
//获取字符串长度的函数。
int size()
{
return strlen(this->m_data);
}
//MyString的中括号运算符重载函数。
char operator[](int index)
{
//1.判断下标是否合法。
if(index < 0 || index > this->size())
{
cout << “越界” << endl;
}
return this->m_data[index];
}
//MyString的=号运算符重载
MyString& operator=(const MyString& other)
{
if(this == &other)
{
return *this;
}
//获取另一对象中的字符长度。
int len = strlen(other.m_data);
//如果本象中的中属性指针有一个指向。就需要先释放。再开辟新的足名够大的空间才可以。
if(this->m_data != nullptr)
{
delete []m_data;
this->m_data = new char[len + 1];
}else
{
this->m_data = new char[len + 1];
}
//拷贝数据:
memmove(this->m_data, other.m_data, len);
this->m_data[len] = ‘\0’;
return this;
}
//作业,写完发群里。
//同学这个自己去写,可以使用strncat,或者自己纯纯的生写。
MyString& operator+(const MyString& other)
{
//this->m_data = strncat(this->m_data,other.m_data,strlen(other.m_data));
int len = strlen(this->m_data) + strlen(other.m_data);
char temp = new char[len + 1];
memmove(temp,this->m_data,strlen(this->m_data));
memmove(temp + strlen(this->m_data),other.m_data,strlen(other.m_data));
temp[len] = ‘\0’;
delete []this->m_data;
this->m_data = temp;
return *this;
}
char* getM_data()
{
return this->m_data;
}
};
//实现一个<<运算符重载;
ostream& operator<<(ostream& cout, MyString& other)
{
cout << other.getM_data();
return cout;
}
int main()
{
MyString str1;
MyString str2(“zhangsan”);//证明我们的有参构造没有问题。
str1 = str2;//我们的=号运符重载没问题。
cout << str1 << endl;//<<左移也没问题。
MyString str3(str1);//拷贝构造也没问题。
cout << str3 << endl;
cout << str3[4] << endl;
return 0;
}