string类的实现

#include <string>
#include <iostream>
using namespace std;


class mystring
{
	friend std::ostream& operator<<( std::ostream& os, const mystring& str);  

public:
	mystring(const char*	pSrc = " ");
	mystring(const mystring&	mystr);
	~mystring();
	size_t	getlength();
	const char* to_c_str() const;
	mystring& operator= (const mystring& str);		   //operator=
	mystring operator+ (const mystring& lhs);          //operator+
	bool operator==(const mystring& str);              //operator==
	char& operator[](unsigned int index);			   //operator[]

private:
	char*	m_data;
};

mystring::mystring(const char* pSrc)
{
	if (NULL == pSrc)
	{
		m_data = 0;
	}
	else
	{
		size_t	iLen = strlen(pSrc);
		m_data = new char[(iLen+1)*sizeof(char)];
		memset(m_data, 0, (iLen+1)*sizeof(char));
		memcpy(m_data, pSrc, iLen);
	}
}

mystring::~mystring()
{
	if (m_data)
	{
		delete []m_data;
		m_data = NULL;
	}
}

std::ostream& operator<<( std::ostream& os, const mystring& str )  
{  
	os<< str.m_data;  
	return os;  
}  

const char*	mystring::to_c_str() const
{
	return m_data;
}

size_t	mystring::getlength()
{
	size_t ret = 0;
	if (this->m_data)
	{
		ret = strlen(m_data);
	}

	return ret;
}

mystring::mystring(const mystring &mystr)
{
	if (NULL == mystr.m_data)
	{
		this->m_data = NULL;
	}
	size_t	iLen = strlen(mystr.m_data);
	this->m_data = new char[(iLen+1)*sizeof(char)];
	memset(this->m_data, 0, (iLen+1)*sizeof(char));
	memcpy(this->m_data, mystr.m_data, iLen);
}

//在原对象上直接操作修改,运算结果一般作为左值
mystring& mystring::operator =(const mystring &str)
{
	if (this != &str)
	{
		delete []this->m_data;	//清空原来的数据
		if (NULL == str.m_data)
		{
			this->m_data = NULL;
		}
		else
		{
			size_t iLen = strlen(str.m_data);
			this->m_data = new	char[(iLen+1)*sizeof(char)];
			memset(this->m_data, 0 ,(iLen+1)*sizeof(char));
			memcpy(this->m_data, str.m_data, iLen);
		}
	}

	return *this;
}

mystring	mystring::operator+ (const mystring &rhs)
{
	mystring	resultstring;
	if (NULL == rhs.m_data)
	{
		resultstring = *this;
	}
	else
	{
		size_t	iLenlth = strlen(this->m_data);
		size_t	iLenrth = strlen(rhs.m_data);
		resultstring.m_data = new char[(iLenlth+iLenrth+1)*sizeof(char)];
		memset(resultstring.m_data, 0, (iLenlth+iLenrth+1)*sizeof(char));

		memcpy(resultstring.m_data, this->m_data, iLenlth);
		memcpy(resultstring.m_data+iLenlth, rhs.m_data, iLenrth);
	}
	return resultstring;
}

bool mystring::operator ==(const mystring &str)
{
	if ( strlen(str.m_data) != strlen(m_data) )
	{
		return false;
	}	
	return strcmp(m_data,str.m_data)?false:true;
}

char& mystring::operator [](unsigned int index)
{
	size_t iLen = this->getlength();
	if (index >= 0 && index < iLen)
	{
		return this->m_data[index];
	}
}

测试代码

int _tmain(int argc, _TCHAR* argv[])
{
	mystring  str1("sahfjh");
	mystring  str2;
	//Test	构造函数
	std::cout<<"str1 == "<<str1<<endl;
	std::cout<<"str1 length() === "<<str1.getlength()<<endl;
	std::cout<<"str2 length() === "<<str2.getlength()<<endl;
	
	//测试拷贝构造函数
	mystring	mycopystr(str1);
	std::cout<<"mycopystr === "<<mycopystr<<endl;

	char	szBuf[10] =  {0};
	memcpy(szBuf, str1.to_c_str(), str1.getlength());
	cout<<"szBuf  === "<<szBuf<<endl;

	char	szBuf2[10] =  {0};
	memcpy(szBuf2, str2.to_c_str(), str2.getlength());		//直接用strcpy会奔溃,实现和string自实现不同
	cout<<"szBuf2  === "<<szBuf2<<endl;

	//测试赋值运算符
	str2 = str1;
	cout<<"str2  === "<<str2<<endl;

	//测试+运算符
	mystring	test1("Hello");
	mystring	test2(" World");
	cout<<test1+test2<<endl;
	
	//测试[]运算符
	char	word = test1[0];
	cout<<word<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值