• 面试题1:赋值运算符函数(考虑异常安全性的解法)


    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    
    class CMyString
    {
    public:
        CMyString(char *str = nullptr) {
    
            m_data = new char[strlen(str) + 1];
            if (m_data == nullptr) {
                exit(1);
            }
            else {
                strcpy(m_data, str);
            }
        }
    
        CMyString(const CMyString& str)
        {
            if (this != &str)
            {
                CMyString strTemp(str.m_data);
    
                char *pTemp = strTemp.m_data;
                strTemp.m_data = m_data;
                m_data = pTemp;
            }
        }
    
        CMyString& operator = (const CMyString& str);
    
        void Print()
        {
            cout << m_data << endl;
        }
    
        ~CMyString() 
        {
            delete m_data;
        }
    
    private:
        char *m_data;
    };
    
    CMyString& CMyString::operator=(const CMyString& str)
    {
        if (this != &str) 
        {
            CMyString strTemp(str);
    
            char *pTemp = strTemp.m_data;
            strTemp.m_data = m_data;
            m_data = pTemp;
        }
    
        return *this;
    }
    
    
    int main()
    {
        CMyString a("douzi");
        CMyString b("love you");
        a.Print();
        b.Print();
    
        a = b;
        a.Print();
    
        a = a;
        a.Print();
    
        a = a = a;
        a.Print();
    
        b = b = a = a;
        b.Print();
    
        return 0;
    }
    • 先创建一个临时实例strTemp

    • 接着把strTemp.m_data和实例自身的m_data进行交换。由于strTemp是一个局部变量,程序运行到if外面会自动调用strTemp的析构函数,把strTemp.m_data所指向的内存释放掉。

    • 由于strTemp.m_data所指向的内存就是实例之前m_pData的内存,这样就相当于自动调用析构函数释放实例的内存

  • 相关阅读:
    浅谈代理
    AFN
    网络请求
    Socket
    几种加密方式
    8种传值方式
    swift属性观察者机智
    Swift 字符串的分割
    Xcode 所有版本
    Error Domain=ALAssetsLibraryErrorDomain Code=-3310 "数据不可用" .......
  • 原文地址:https://www.cnblogs.com/douzujun/p/10519837.html
Copyright © 2020-2023  润新知