zoukankan      html  css  js  c++  java
  • 赋值运算符函数__from <剑指Offer>

            前段时间忙于项目,难得偷得几日闲,为即将到来的就业季做准备。在面试时,应聘者要注意多和考官交流,只有具备良好的沟通能力,才能充分了解面试官的需求,从而有针对性地选择算法解决问题。

            题目来源于《剑指Offer》,自己在原有基础上稍作批注和修改。

            问题:为类型添加赋值运算符函数,可以把CMyString实例赋值给另一个实例、自身和连续赋值。

            学习点:考虑问题充分,自己不会把赋值情况、内存泄漏考虑到这么细致。

    #include<cstring>
    #include<cstdio>
    
    class CMyString
    {
    public:
        CMyString(char * pData = nullptr);
        CMyString(const CMyString& str);
        ~CMyString(void);
        CMyString& operator=(const CMyString& str);
        void Print();
    
    private:
        char* m_pData;  //类比C风格字符串
    };
    
    CMyString::CMyString(char * pData)
    {
        if (pData==nullptr)  //空指针
        {
            //创建空字符串
            m_pData = new char[1];
            m_pData[0] = '';
        }
        else
        {
            int length = strlen(pData);
            m_pData = new char[length + 1];
            //复制
            /*
                char * strcpy(char * destination, const char * source);
                Copies the C string pointed by source into the array pointed by destination, including the terminating null character(and stopping at that point).
            */
            strcpy(m_pData, pData);
        }
    }
    
    CMyString::CMyString(const CMyString& str)
    {
        int length = strlen(str.m_pData);  //Returns the length of the C string str. The length of a C string is determined by the terminating null - character
        m_pData = new char[length + 1];  //new分配内存后,默认使用delete释放对象
        strcpy(m_pData, str.m_pData);
    }
    
    CMyString::~CMyString(void)
    {
        delete[] m_pData;
    }
    
    //1. 返回值的类型声明为该类型的引用,程序结束前返回实例自身的引用(*this)
    //2. 传入的参数的类型声明为常量引用
    //3. 释放实例自身的内存
    //4. 判断传入的参数和当前的实例是不是同一个实例
    //5. 升级:考虑异常安全性的解法 先new再delete
    CMyString& CMyString::operator=(const CMyString& str)  //参考2
    {
        if (this != &str)  //参考4
        {
            CMyString strTemp(str);  //临时实例
            //参考3
            char* pTemp = strTemp.m_pData;
            strTemp.m_pData= m_pData;
            m_pData = pTemp;
        }//调用strTemp的析构函数,释放其内存
        //参考1
        return *this;
    }
    
    //=================  测试代码  ==================
    void CMyString::Print()
    {
        printf("%s", m_pData);
    }
    
    void Test1()
    {
        printf("Test1 begins:
    ");
    
        char* text = "Hello world";
    
        CMyString str1(text);
        CMyString str2;
        str2 = str1;
    
        printf("The expected result is: %s.
    ", text);
    
        printf("The actual result is: ");
        str2.Print();
        printf(".
    ");
    }
    
    // 赋值给自己
    void Test2()
    {
        printf("Test2 begins:
    ");
    
        char* text = "Hello world";
    
        CMyString str1(text);
        str1 = str1;
    
        printf("The expected result is: %s.
    ", text);
    
        printf("The actual result is: ");
        str1.Print();
        printf(".
    ");
    }
    
    // 连续赋值
    void Test3()
    {
        printf("Test3 begins:
    ");
    
        char* text = "Hello world";
    
        CMyString str1(text);
        CMyString str2, str3;
        str3 = str2 = str1;
    
        printf("The expected result is: %s.
    ", text);
    
        printf("The actual result is: ");
        str2.Print();
        printf(".
    ");
    
        printf("The expected result is: %s.
    ", text);
    
        printf("The actual result is: ");
        str3.Print();
        printf(".
    ");
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        getchar();  //等待输入
        return 0;
    }
  • 相关阅读:
    工业和信息化部“十二五”规划教材:阵列信号处理及MATLAB实现
    PHP 7从零基础到项目实战
    HTML+CSS网页设计详解
    新编 中文版Maya入门与提高
    Lua游戏AI开发指南
    这么设计能热卖:融入运营思维的电商设计进阶宝典(套装上下册)
    WCF初探-1:认识WCF
    用微信二维码登录自己的网站
    01-C语言基本知识
    「OC」内存管理
  • 原文地址:https://www.cnblogs.com/DHUtoBUAA/p/7212421.html
Copyright © 2011-2022 走看看