手动写一个String类型

简言:

        自己写一个string类型,然后实现基本的功能,提供基本的接口。

MyString.h


#pragma once
#include <iostream>
typedef char*  Iterator;
class MyString
{
	friend std::ostream & operator<<(std::ostream &ostream, const MyString& string);
	friend std::istream & operator>>(std::istream &istream, MyString& string);
public:
	MyString();
	MyString(const char * code);
	MyString(const MyString& other);
	~MyString();
	MyString& operator=(const MyString & another);
	MyString& operator=(const char* code);
	MyString operator+(const MyString & another);
	Iterator begin();
	Iterator end();
	Iterator m_pIterator;
	bool operator==(const MyString & another);
	char& operator[](int index);
	int size();
	bool compare(const char* str, const char* other,int strSize,int otherSize);
private:
	char * m_pString;
	int m_size;
};

MyString.cpp

#include "MyString.h"

#pragma  warning (disable:4996) 
MyString::MyString()
{
	m_pString = NULL;
	m_size = 0;
}

MyString::MyString(const char * code)
{
	if (code!=NULL)
	{
		m_size = strlen(code);
		m_pString = new char[m_size + 1];
		memcpy(m_pString, code, (m_size + 1) * sizeof(char));
		return;
	}
	m_size = 0;
	m_pString = new char[1];
	memcpy(m_pString, "", sizeof(char));
}

MyString::MyString(const MyString & other)
{
	m_size = strlen(other.m_pString);
	m_pString = new char[m_size + 1];
	memcpy(m_pString, other.m_pString, (m_size + 1) * sizeof(char));
}

MyString::~MyString()
{
	if (NULL != m_pString)
	{
		delete[] m_pString;
		m_pString = NULL;
	}
}

MyString & MyString::operator=(const MyString & another)
{
	if (NULL != m_pString)
	{
		delete[] m_pString;
		m_size = 0;
		m_pString = NULL;
	}
	m_size = another.m_size;
	m_pString = new char[m_size + 1];
	memcpy(m_pString, another.m_pString, (m_size + 1) * sizeof(char));
	return *this;	
}

MyString & MyString::operator=(const char * code)
{
	if (code != NULL)
	{
		m_size = strlen(code);
		m_pString = new char[m_size + 1];
		memcpy(m_pString, code, (m_size + 1) * sizeof(char));
		return *this;
	}
	m_size = 0;
	m_pString = new char[1];
	memcpy(m_pString, "", sizeof(char));
	return *this;
}

MyString MyString::operator+(const MyString & another)
{
	MyString tempStr;
	tempStr.m_size = m_size + another.m_size;
	tempStr.m_pString = new char[tempStr.m_size + 1];
	memcpy(tempStr.m_pString, m_pString, (tempStr.m_size + 1) * sizeof(char));
	strcat(tempStr.m_pString, another.m_pString); 
	return tempStr;
}



Iterator MyString::begin()
{
	if (NULL != m_pString)
	{
		m_pIterator = m_pString;
	}
	return m_pIterator;
}

Iterator MyString::end()
{
	m_pIterator = &(m_pString[m_size + 1]);
	return m_pIterator;
}

std::ostream & operator<<(std::ostream & ostream, const MyString & string)
{
	ostream << string.m_pString << std::endl;
	return ostream;

}

std::istream & operator>>(std::istream & istream, MyString & string)
{
	char tempStr[1000] = {0};
	istream >> tempStr;
	string.m_size = strlen(tempStr);
	string.m_pString = new char[string.m_size + 1];
	memcpy(string.m_pString, tempStr, (string.m_size + 1) * sizeof(char));
	return istream;
}

bool MyString::operator==(const MyString & another)
{
	return compare(m_pString, another.m_pString, m_size, another.m_size);
}

char & MyString::operator[](int index)
{
	if (index > m_size)
	{
		return m_pString[m_size];
	}
	return m_pString[index];
}

int MyString::size()
{
	return m_size;
}

bool MyString::compare(const char * str, const char * other, int strSize, int otherSize)
{
	if (strSize != otherSize)
	{
		return false;
	}
	for (int i = 0; i < strSize; ++i)
	{
		if ((*str) != (*other))
		{
			return false;
		}
	}
	return true;
}

最后是main.cpp

#include "MyString.h"

int main()
{
	MyString str1("happy");
	MyString str2(" world");
	MyString str3("baby");
	MyString str5("!");
	MyString str4 = str1 + str2;
	if (str3 == str5)
	{
		std::cout << str4;
	}
	else
	{
		std::cout << str4.size() << std::endl;
	}
	for (auto itor = str1.begin(); itor != str1.end(); ++itor)
	{
		std::cout << *itor << std::endl;
	}
	std::cout << str4[5] << std::endl;

}

        欢迎大家讨论指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值