#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> #include <cstdlib> using namespace std; class CMyString { public: CMyString(char *str = nullptr) { m_data = new char[strlen(str) + 1]; if (m_data == nullptr) { exit(1); } else { strcpy(m_data, str); } } CMyString(const CMyString& str) { if (this != &str) { CMyString strTemp(str.m_data); char *pTemp = strTemp.m_data; strTemp.m_data = m_data; m_data = pTemp; } } CMyString& operator = (const CMyString& str); void Print() { cout << m_data << endl; } ~CMyString() { delete m_data; } private: char *m_data; }; CMyString& CMyString::operator=(const CMyString& str) { if (this != &str) { CMyString strTemp(str); char *pTemp = strTemp.m_data; strTemp.m_data = m_data; m_data = pTemp; } return *this; } int main() { CMyString a("douzi"); CMyString b("love you"); a.Print(); b.Print(); a = b; a.Print(); a = a; a.Print(); a = a = a; a.Print(); b = b = a = a; b.Print(); return 0; }
-
先创建一个临时实例strTemp
-
接着把strTemp.m_data和实例自身的m_data进行交换。由于strTemp是一个局部变量,程序运行到if外面会自动调用strTemp的析构函数,把strTemp.m_data所指向的内存释放掉。
-
由于strTemp.m_data所指向的内存就是实例之前m_pData的内存,这样就相当于自动调用析构函数释放实例的内存