#include <string.h>
#include <iostream>
using namespace std;
class CMyString
{
friend std::ostream& operator << ( std::ostream& os, const CMyString& str); //**
public:
CMyString(const char *str = NULL);
CMyString(const CMyString &str);
~CMyString(void);
CMyString& operator = ( const CMyString &str );
CMyString operator + ( const CMyString& str );
bool operator == ( const CMyString& str );
char operator [] ( unsigned int idx );
unsigned int getLength();
private:
char *m_pData;
unsigned int m_nLen;
};
std::ostream& operator << ( std::ostream& os, const CMyString& str )
{
os << str.m_pData;
return os;
}
CMyString::CMyString(const char *str)
{
if ( str == NULL )
{
m_nLen = 0;
m_pData = new char[1];
if ( m_pData != NULL )
m_pData[0] = '\0'; //**
}
else
{
m_nLen = strlen(str);
m_pData = new char[m_nLen+1];
if ( m_pData != NULL )
strcpy_s(m_pData, m_nLen+1, str);
}
}
CMyString::CMyString(const CMyString &str)
{
m_nLen = str.m_nLen;
m_pData = new char[m_nLen+1];
if ( m_pData != NULL )
strcpy_s(m_pData, m_nLen+1, str.m_pData);
}
CMyString::~CMyString()
{
delete []m_pData;
}
CMyString & CMyString::operator = (const CMyString &str)
{
if ( this == &str ) //**
return *this;
delete []m_pData;
m_nLen = str.m_nLen;
m_pData = new char[m_nLen+1];
if ( m_pData != NULL )
strcpy_s(m_pData, m_nLen+1, str.m_pData);
return *this;
}
CMyString CMyString::operator+( const CMyString& str ) //有问题
{
CMyString newString;
if ( str.m_pData == NULL )
{
newString = *this;
}
else if ( m_pData == NULL)
{
newString = str;
}
else
{
newString.m_nLen = m_nLen + str.m_nLen;
newString.m_pData = new char[ newString.m_nLen +1 ];
if ( newString.m_pData != NULL )
{
strcpy_s( newString.m_pData, newString.m_nLen+1, m_pData );
strcat_s( newString.m_pData, newString.m_nLen+1, str.m_pData );
}
}
return newString;
}
bool CMyString::operator == ( const CMyString& str )
{
if ( m_nLen != str.m_nLen )
{
return false;
}
else
{
return strcmp(m_pData, str.m_pData ) ? false : true;
}
}
char CMyString::operator[]( unsigned int idx )
{
char c=0;
if ( idx >= 0 && idx < m_nLen )
return m_pData[idx];
else
return c;
}
unsigned int CMyString::getLength()
{
return m_nLen;
}
int main(void)
{
CMyString ctmp("hello");
ctmp = ctmp + " world";
cout << ctmp << ", len=" << ctmp.getLength() << endl;
for ( unsigned int i=0; i < ctmp.getLength(); i++ )
{
cout << ctmp[i] << endl;
}
return 0;
}
运行结果: