#include <iostream>
#include <assert.h>
#include <string.h>
using namespace std;
class String
{
public:
String(const char * tmp = NULL); //构造函数
String(const String &object); //拷贝构造函数
String &operator = (const String &object); //赋值函数
~String();
private:
char * m_str;
};
String::String(const char *tmp)
{
m_str = NULL;
if ( NULL == tmp )
{
m_str = new char[1];
assert ( m_str != NULL ); //检测分配是否成功
memset(m_str,0,sizeof(char)*1);
*m_str = '/0';
}
else
{
int length = strlen(tmp) + 1; //多分配一个空间,用于结束符
m_str = new char[sizeof(char)*length];
assert ( m_str != NULL );
memset(m_str,0,sizeof(char)*length);
strcpy(m_str,tmp);
}
}
String::String(const String &object)
{
m_str = NULL;
int length = strlen(object.m_str)+1;
m_str = new char[length];
assert ( m_str != NULL );
memset(m_str,0,sizeof(char)*length);
strcpy(m_str,object.m_str);
}
String & String::operator = (const String & object)
{
if (this == &object ) //此处用指针判断
{
return * this;
}
if ( m_str != NULL)
{
delete []m_str;
m_str = NULL;
}
int length = strlen(object.m_str)+1;
m_str = new char[length];
assert ( m_str != NULL );
memset(m_str,0,sizeof(char)*length);
strcpy(m_str,object.m_str);
return * this; //拷贝完后返回自身,注意是*,因为是引用
}
String::~String()
{
if (m_str != NULL )
{
delete []m_str;
m_str = NULL;
}
}