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