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;
    }

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

  • 相关阅读:
    使用WCF实现消息推送
    T31P电子秤数据读取
    持续性任务代码的一些测试
    XP+Android手机DIY家庭视频点播系统-历时3周全力打造吊丝的幸福生活
    Android 上传文件到XP
    Android ListView的一个坑,你可掉进去过?
    无脑无负担网站架构-- Application Request Route的一些应用
    Android 一些注意
    懒人的ERP开发框架--2B&苦B程序员专用
    PHP Token(令牌)设计应用
  • 原文地址:https://www.cnblogs.com/long3216/p/4438450.html
Copyright © 2011-2022 走看看