阅读背景:

手动实现String类——MyString类

来源:互联网 
MyString.h #ifndef _MYSTRING_H #define _MYSTRING_H #include "iostream" using namespace std; class MyString { private: int m_len; char *m_data; public: MyString(); MyString(char *str); MyString(int len, char ch); MyString(const MyString &s); //拷贝构造函数 friend ostream &operator <<(ostream &out, const MyString &str); //重载实现直接输出字符串 friend istream &operator >>(istream &in,MyString &str); //重载实现直接输入字符串,输入不能是const MyString &operator =(const MyString &str); //重载实现字符串赋值给字符串 MyString &operator +=(const MyString &str); //重载实现字符串的+= char &operator [](int index); //重载实现对第n个字符进行操作 }; #endif MyString.cpp #include "iostream" #include "MyString.h" #include "string.h" using namespace std; MyString::MyString() //无参构造函数 { m_len = 1; m_data = new char[m_len + 1]; //strcpy(m_data, "sjw"); } MyString::MyString(char *str) //带参的构造函数第一种 { m_len = strlen(str); m_data = new char[m_len + 1]; strcpy(m_data,str); } MyString::MyString(int len, char ch) //带参的构造函数第二种 { m_len = len; m_data = new char[m_len + 1]; for (int i = 0; i < len; i++) { m_data[i] = ch; } m_data[len] = '
MyString.h #ifndef _MYSTRING_H #define _MYSTRING_H #include "iostream" using namespace std; class MyString { private: int m_len; char *m_data; public: MyString(); MyString(char *str); MyString(int len, char ch); MyString(const MyString &s); //拷贝构造函数 friend ostream &operator <<(ostream &out, const MyString &str); //重载实现直接输出字符串 friend istream &operator >>(istream &in,MyString &str); //重载实现直接输入字符串,输入不能是const MyString &operator =(const MyString &str); //重载实现字符串赋值给字符串 MyString &operator +=(const MyString &str); //重载实现字符串的+= char &operator [](int index); //重载实现对第n个字符进行操作 }; #endif MyString.cpp #include "iostream" #include "MyString.h" #include "string.h" using namespace std; MyString::MyString() //无参构造函数 { m_len = 1; m_data = new char[m_len + 1]; //strcpy(m_data, "sjw"); } MyString::MyString(char *str) //带参的构造函数第一种 { m_len = strlen(str); m_data = new char[m_len + 1]; strcpy(m_data,str); } MyString::MyString(int len, char ch) //带参的构造函数第二种 { m_len = len; m_data = new char[m_len + 1]; for (int i = 0; i < len; i++) { m_data[i] = ch; } m_data[len] = '\0'; //字符串最后是‘\0’ } MyString::MyString(const MyString &s) //拷贝构造函数 { m_len = strlen(s.m_data); m_data = new char[m_len + 1]; strcpy(this->m_data, s.m_data); } ostream &operator <<(ostream &out, const MyString &str) //重载实现直接输出字符串 { out << str.m_data; return out; } istream &operator >>(istream &in, MyString &str) //重载实现直接输入字符串 { char tmp[1024] = { 0 }; //先用tmp去接缓冲区的值 in >> tmp; if (str.m_data != NULL) //再释放m_data的值 { delete str.m_data; } str.m_len = strlen(tmp); str.m_data = new char[str.m_len + 1]; //+1是字符串最后的'\0'也要放进去 strcpy(str.m_data, tmp); return in; } MyString &MyString:: operator =(const MyString &str) //重载实现字符串赋值给字符串 { m_len = str.m_len; if (str.m_data != NULL) { delete str.m_data; } m_data = new char[m_len + 1]; strcpy(m_data, str.m_data); return *this; } MyString &MyString:: operator +=(const MyString &str) //重载实现字符串的+= { m_len = m_len + str.m_len; //s1 += s2,相当于把s2的内容接到s1的后面,所以长度也要相加 char *tmp = new char[m_len + 1]; strcpy(tmp, m_data); strcat(tmp, str.m_data); delete m_data; m_data = tmp; return *this; } char &MyString::operator [](int index) //重载实现对第n个字符进行操作 { return m_data[index]; } main.cpp #include "iostream" #include "MyString.h" using namespace std; int main() { MyString s1; cin >> s1; MyString s2("hello"); MyString s3(10, 'a'); MyString s4 = s2; MyString s5(s2); s2 += s1; s5[2] = 'x'; cout << s1 << endl; cout << s2 << endl; cout << s3 << endl; cout << s4[0] << endl; cout << s5 << endl; system("pause"); return 0; }
'; //字符串最后是‘
MyString.h #ifndef _MYSTRING_H #define _MYSTRING_H #include "iostream" using namespace std; class MyString { private: int m_len; char *m_data; public: MyString(); MyString(char *str); MyString(int len, char ch); MyString(const MyString &s); //拷贝构造函数 friend ostream &operator <<(ostream &out, const MyString &str); //重载实现直接输出字符串 friend istream &operator >>(istream &in,MyString &str); //重载实现直接输入字符串,输入不能是const MyString &operator =(const MyString &str); //重载实现字符串赋值给字符串 MyString &operator +=(const MyString &str); //重载实现字符串的+= char &operator [](int index); //重载实现对第n个字符进行操作 }; #endif MyString.cpp #include "iostream" #include "MyString.h" #include "string.h" using namespace std; MyString::MyString() //无参构造函数 { m_len = 1; m_data = new char[m_len + 1]; //strcpy(m_data, "sjw"); } MyString::MyString(char *str) //带参的构造函数第一种 { m_len = strlen(str); m_data = new char[m_len + 1]; strcpy(m_data,str); } MyString::MyString(int len, char ch) //带参的构造函数第二种 { m_len = len; m_data = new char[m_len + 1]; for (int i = 0; i < len; i++) { m_data[i] = ch; } m_data[len] = '\0'; //字符串最后是‘\0’ } MyString::MyString(const MyString &s) //拷贝构造函数 { m_len = strlen(s.m_data); m_data = new char[m_len + 1]; strcpy(this->m_data, s.m_data); } ostream &operator <<(ostream &out, const MyString &str) //重载实现直接输出字符串 { out << str.m_data; return out; } istream &operator >>(istream &in, MyString &str) //重载实现直接输入字符串 { char tmp[1024] = { 0 }; //先用tmp去接缓冲区的值 in >> tmp; if (str.m_data != NULL) //再释放m_data的值 { delete str.m_data; } str.m_len = strlen(tmp); str.m_data = new char[str.m_len + 1]; //+1是字符串最后的'\0'也要放进去 strcpy(str.m_data, tmp); return in; } MyString &MyString:: operator =(const MyString &str) //重载实现字符串赋值给字符串 { m_len = str.m_len; if (str.m_data != NULL) { delete str.m_data; } m_data = new char[m_len + 1]; strcpy(m_data, str.m_data); return *this; } MyString &MyString:: operator +=(const MyString &str) //重载实现字符串的+= { m_len = m_len + str.m_len; //s1 += s2,相当于把s2的内容接到s1的后面,所以长度也要相加 char *tmp = new char[m_len + 1]; strcpy(tmp, m_data); strcat(tmp, str.m_data); delete m_data; m_data = tmp; return *this; } char &MyString::operator [](int index) //重载实现对第n个字符进行操作 { return m_data[index]; } main.cpp #include "iostream" #include "MyString.h" using namespace std; int main() { MyString s1; cin >> s1; MyString s2("hello"); MyString s3(10, 'a'); MyString s4 = s2; MyString s5(s2); s2 += s1; s5[2] = 'x'; cout << s1 << endl; cout << s2 << endl; cout << s3 << endl; cout << s4[0] << endl; cout << s5 << endl; system("pause"); return 0; }
’ } MyString::MyString(const MyString &s) //拷贝构造函数 { m_len = strlen(s.m_data); m_data = new char[m_len + 1]; strcpy(this->m_data, s.m_data); } ostream &operator <<(ostream &out, const MyString &str) //重载实现直接输出字符串 { out << str.m_data; return out; } istream &operator >>(istream &in, MyString &str) //重载实现直接输入字符串 { char tmp[1024] = { 0 }; //先用tmp去接缓冲区的值 in >> tmp; if (str.m_data != NULL) //再释放m_data的值 { delete str.m_data; } str.m_len = strlen(tmp); str.m_data = new char[str.m_len + 1]; //+1是字符串最后的'
MyString.h #ifndef _MYSTRING_H #define _MYSTRING_H #include "iostream" using namespace std; class MyString { private: int m_len; char *m_data; public: MyString(); MyString(char *str); MyString(int len, char ch); MyString(const MyString &s); //拷贝构造函数 friend ostream &operator <<(ostream &out, const MyString &str); //重载实现直接输出字符串 friend istream &operator >>(istream &in,MyString &str); //重载实现直接输入字符串,输入不能是const MyString &operator =(const MyString &str); //重载实现字符串赋值给字符串 MyString &operator +=(const MyString &str); //重载实现字符串的+= char &operator [](int index); //重载实现对第n个字符进行操作 }; #endif MyString.cpp #include "iostream" #include "MyString.h" #include "string.h" using namespace std; MyString::MyString() //无参构造函数 { m_len = 1; m_data = new char[m_len + 1]; //strcpy(m_data, "sjw"); } MyString::MyString(char *str) //带参的构造函数第一种 { m_len = strlen(str); m_data = new char[m_len + 1]; strcpy(m_data,str); } MyString::MyString(int len, char ch) //带参的构造函数第二种 { m_len = len; m_data = new char[m_len + 1]; for (int i = 0; i < len; i++) { m_data[i] = ch; } m_data[len] = '\0'; //字符串最后是‘\0’ } MyString::MyString(const MyString &s) //拷贝构造函数 { m_len = strlen(s.m_data); m_data = new char[m_len + 1]; strcpy(this->m_data, s.m_data); } ostream &operator <<(ostream &out, const MyString &str) //重载实现直接输出字符串 { out << str.m_data; return out; } istream &operator >>(istream &in, MyString &str) //重载实现直接输入字符串 { char tmp[1024] = { 0 }; //先用tmp去接缓冲区的值 in >> tmp; if (str.m_data != NULL) //再释放m_data的值 { delete str.m_data; } str.m_len = strlen(tmp); str.m_data = new char[str.m_len + 1]; //+1是字符串最后的'\0'也要放进去 strcpy(str.m_data, tmp); return in; } MyString &MyString:: operator =(const MyString &str) //重载实现字符串赋值给字符串 { m_len = str.m_len; if (str.m_data != NULL) { delete str.m_data; } m_data = new char[m_len + 1]; strcpy(m_data, str.m_data); return *this; } MyString &MyString:: operator +=(const MyString &str) //重载实现字符串的+= { m_len = m_len + str.m_len; //s1 += s2,相当于把s2的内容接到s1的后面,所以长度也要相加 char *tmp = new char[m_len + 1]; strcpy(tmp, m_data); strcat(tmp, str.m_data); delete m_data; m_data = tmp; return *this; } char &MyString::operator [](int index) //重载实现对第n个字符进行操作 { return m_data[index]; } main.cpp #include "iostream" #include "MyString.h" using namespace std; int main() { MyString s1; cin >> s1; MyString s2("hello"); MyString s3(10, 'a'); MyString s4 = s2; MyString s5(s2); s2 += s1; s5[2] = 'x'; cout << s1 << endl; cout << s2 << endl; cout << s3 << endl; cout << s4[0] << endl; cout << s5 << endl; system("pause"); return 0; }
'也要放进去 strcpy(str.m_data, tmp); return in; } MyString &MyString:: operator =(const MyString &str) //重载实现字符串赋值给字符串 { m_len = str.m_len; if (str.m_data != NULL) { delete str.m_data; } m_data = new char[m_len + 1]; strcpy(m_data, str.m_data); return *this; } MyString &MyString:: operator +=(const MyString &str) //重载实现字符串的+= { m_len = m_len + str.m_len; //s1 += s2,相当于把s2的内容接到s1的后面,所以长度也要相加 char *tmp = new char[m_len + 1]; strcpy(tmp, m_data); strcat(tmp, str.m_data); delete m_data; m_data = tmp; return *this; } char &MyString::operator [](int index) //重载实现对第n个字符进行操作 { return m_data[index]; } main.cpp #include "iostream" #include "MyString.h" using namespace std; int main() { MyString s1; cin >> s1; MyString s2("hello"); MyString s3(10, 'a'); MyString s4 = s2; MyString s5(s2); s2 += s1; s5[2] = 'x'; cout << s1 << endl; cout << s2 << endl; cout << s3 << endl; cout << s4[0] << endl; cout << s5 << endl; system("pause"); return 0; } MyString.h #ifndef _MYSTRING_H #define _MYSTRING_



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: