赋值运算符函数
已知类:
class CMyString { public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void); private: char* m_pData; };
初级实现:
CMyString& CMyString::operator = (const CMyString& str) //返回引用,可连续赋值;参数为常量引用,可提高效率,避免形参与实参间多调用一次拷贝构造函数 { if (this == &str) return *this; delete[] m_pData; //若在分配新内存前忘记释放已有内存会造成内存泄露 m_pData = NULL; m_pData = new char(strlen(str.m_pData) + 1); //分配内存时可能会因为内存不足导致异常,m_pData成为空指针,容易导致程序崩溃 strcpy(m_pData, str.m_pData); return *this; }
高级实现:
CMyString& CMyString::operator = (const CMyString& str) { if (this != &str) { CMyString strTemp(str); //创建临时实例,在构造函数中用new分配内存,若出现异常,不会执行下面逻辑,因此不会修改原有实例 char* temp = strTemp.m_pData; //将临时实例strTemp.m_pData与原有实例m_pData做交换 strTemp.m_pData = m_pData; m_pData = temp; } //局部变量出作用域后,自动调用strTemp析构函数,释放交换后原有实例的内存 return *this; }