{面试题1: 赋值运算符函数}
From 剑指Offer 何海涛 著
#include <iostream> #include <cstring> class CMyString { public: CMyString(char *pData = NULL); CMyString(const CMyString &other); ~CMyString(void); public: CMyString& operator=(const CMyString &other); private: char *m_pData; #if defined(NDEBUG) friend bool isEqual(const CMyString &left, const CMyString &right); #endif }; CMyString::CMyString(char *pData) { if(pData != NULL) { size_t len = strlen(pData); m_pData = new char[len+1]; strcpy(m_pData, pData); } else { m_pData = new char[1]; *m_pData = '\0'; } } CMyString::CMyString(const CMyString &str) { size_t len = strlen(str.m_pData); m_pData = new char[len+1]; strcpy(m_pData, str.m_pData); } CMyString::~CMyString() { delete[] m_pData; m_pData = NULL; } CMyString& CMyString::operator=(const CMyString &other) { if(this != &other) { CMyString tmp(other); // 借助临时实例, 实现动态内存的释放, 符合 异常安全性(Exception Safety) 原则 char *pData = tmp.m_pData; tmp.m_pData = m_pData; m_pData = pData; } return *this; } #ifdef NDEBUG bool isEqual(const CMyString &left, const CMyString &right) { if(left.m_pData != right.m_pData && !strcmp(left.m_pData, right.m_pData)) { return true; } return false; } #endif
测试集:
void test(const CMyString &left, const CMyString &right) { #if defined(NDEBUG) std::cout << std::boolalpha << isEqual(left, right) << std::endl; #endif } int main(int argc,char *argv[]) { char pData[] = "Just For Test!"; CMyString str1(pData); str1 = str1; // 是否支持自赋值 CMyString str2; CMyString str3; str3 = str2 = str1; // 是否支持连续赋值 test(str1, str2); test(str2, str3); return 0; }
异常安全性 原则: 对实例操作过程的过程中, 即便发生了异常, 实例仍能保持有效状态。