{面试题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;
}

异常安全性 原则: 对实例操作过程的过程中, 即便发生了异常, 实例仍能保持有效状态。

posted @ 2015-04-19 00:11  long#long  阅读(139)  评论(0编辑  收藏  举报