//重载赋值运算符 #include <iostream> #include <cstring> using namespace std; class CMystring { private: char* m_pData;//私有变量m_pData public: CMystring(const char* pData = NULL)//具有默认参数的 含参构造函数,注意此处的const { if (pData != NULL)//注意判断是否是空字符串 { m_pData = new char[strlen(pData) + 1]; strcpy(m_pData, pData); } else m_pData = NULL; } CMystring(const CMystring& str)//复制构造函数,注意此处一定是const class_type &,没这个引用是浅复制,容易内存爆炸 { if (str.m_pData != NULL) { m_pData = new char[strlen(str.m_pData) + 1]; strcpy(m_pData, str.m_pData); } else m_pData = NULL; } ~CMystring(void)//析构函数 { delete[] m_pData;//一定释放内存,不然造成内存泄漏 } CMystring& operator= (const CMystring& str)//重载赋值运算符,此处一定要返回类型是引用,不然无法连续赋值,而且参数列表里要用常量引用 { if ((this != &str) && (str.m_pData != NULL))//此处一定判断传入参数和实例是否是一个,不然一旦释放实例,传入参数也被释放了 { if (m_pData != NULL) delete[] m_pData; m_pData = new char[strlen(str.m_pData) + 1]; strcpy(m_pData, str.m_pData); } return *this;//必须返回自身引用,不然无法连续赋值 } void display() { if (m_pData != NULL) { cout << m_pData; } } }; int main() { CMystring str1; CMystring str2("hi"); CMystring str3("hello"); str1 = str2;//测试用例一:实例A赋值实例B str3 = str3;//测试用例二:实例自身赋值 str1 = str2 = str3;//测试用例三:实现连续赋值 str1.display();//这里测试案例写的不好,最好写成void子函数,然后函数内各种cout提示案例实现到哪一步了,这里我有点偷懒 system("pause"); }