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