zoukankan      html  css  js  c++  java
  • {面试题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 = '';
        }
    }
    
    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;
    }

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

  • 相关阅读:
    6、redux源码解析
    5、redux源码解析
    4、redux源码解析
    3、redux码源
    2、redux源码探索
    1、redux源码探索
    Second Autoprefixer control comment was ignored. Autoprefixer applies control comment to whole block, not to next rules.
    Linux命令——whereis
    Linux命令——which
    Linux命令——tail
  • 原文地址:https://www.cnblogs.com/long3216/p/4438450.html
Copyright © 2011-2022 走看看