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