#include <iostream> #include <cstring> using namespace std; class String { // 一切都是深拷贝! private : char *m_data; public : String(const char *str = NULL); String(const String&); String& operator =(const String& rhs); ~String(); void show() { cout << m_data << endl; } }; String::String(const char *str) { // 记住这里你是不能写 m_data = str, 不用犯这种想当然的错误! if(str == NULL) { m_data = new char[1]; m_data[0] = '\0'; } else { int len = strlen(str); m_data = new char[len+1]; strcpy(m_data, str); } } String::String(const String& rhs) { if(rhs.m_data == NULL) { m_data = new char[1]; m_data[0] = '\0'; } else { int len = static_cast<int> (strlen(rhs.m_data)); m_data = new char[len+1]; strcpy(m_data, rhs.m_data); } } String& String::operator =(const String& rhs) { if(this == &rhs) return *this; // *别落下!* delete []m_data; // *一定要先释放以前的!* if(rhs.m_data == NULL) { m_data = new char[1]; m_data[0] = '\0'; } else { int len = static_cast<int> (strlen(rhs.m_data)); m_data = new char[len+1]; strcpy(m_data, rhs.m_data); } return *this; } String::~String() { delete []m_data; } int main() { String s("hello"); String s1("hi"); s = s1; s.show(); return 0; }