#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; }
|