手动实现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] = '\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;
}

猜你喜欢

转载自blog.csdn.net/userkiller/article/details/81236355
今日推荐