#include <iostream>
#include <string.h>
using namespace std;
class String
{
public:
    String(const char * str=NULL)
    {
        if (str == NULL)
        {
            //这两行代码保证了:
            //任一String对象的m_string都不会是NULL,它指向heap上分配给它的空间
            m_string = new char[1];
            m_string = '\0';
        }
        else
        {
            m_string = new char[strlen(str)+1];
            strcpy (m_string, str);
        }
    }
    String(const String & s)
    {
        m_string = new char[strlen(s.m_string)+1];
        strcpy (m_string, s.m_string);
    }
    ~String()
    {
        if (m_string != NULL)
        {
            delete [] m_string;
            m_string = NULL;
        }
        cout << "destructor: m_string is " << ((m_string)?(m_string):("NULL")) << endl;
    }
    String & operator=(const String & s)
    {
        if (&s != this) //注意:判断是否同一对象,要对对象的地址比较
        {
            delete [] m_string;
            m_string = new char[strlen(s.m_string)+1];
            strcpy (m_string, s.m_string);
        }
        return *this;
    }
    char * str(void)
    {
        return m_string;
    }
private:
    char * m_string;
};
int main()
{
    String * a = new String("Becky");
    String * b = new String(NULL);
    String c;
    c= *b = *a;
    cout << "b = " << b->str() <<endl;
    cout << "c = " << c.str() << endl;
    delete a;
    delete b;
    return 0;
}