《剑指offer》第一题(重载赋值运算符)

//重载赋值运算符

#include <iostream>
#include <cstring>
using namespace std;

class CMystring
{
private:
    char* m_pData;//私有变量m_pData

public:
    CMystring(const char* pData = NULL)//具有默认参数的 含参构造函数,注意此处的const
    {
        if (pData != NULL)//注意判断是否是空字符串
        {
            m_pData = new char[strlen(pData) + 1];
            strcpy(m_pData, pData);
        }
        else
            m_pData = NULL;
    }

    CMystring(const CMystring& str)//复制构造函数,注意此处一定是const class_type &,没这个引用是浅复制,容易内存爆炸
    {
        if (str.m_pData != NULL)
        {
            m_pData = new char[strlen(str.m_pData) + 1];
            strcpy(m_pData, str.m_pData);
        }
        else
            m_pData = NULL;
    }

    ~CMystring(void)//析构函数
    {
        delete[] m_pData;//一定释放内存,不然造成内存泄漏
    }

    CMystring& operator= (const CMystring& str)//重载赋值运算符,此处一定要返回类型是引用,不然无法连续赋值,而且参数列表里要用常量引用
    {
        if ((this != &str) && (str.m_pData != NULL))//此处一定判断传入参数和实例是否是一个,不然一旦释放实例,传入参数也被释放了
        {
            if (m_pData != NULL)
                delete[] m_pData;
            m_pData = new char[strlen(str.m_pData) + 1];
            strcpy(m_pData, str.m_pData);
        }
        return *this;//必须返回自身引用,不然无法连续赋值
    }

    void display()
    {
        if (m_pData != NULL)
        {
            cout << m_pData;
        }
    }

};

int main()
{
    CMystring str1;
    CMystring str2("hi");
    CMystring str3("hello");
    str1 = str2;//测试用例一:实例A赋值实例B
    str3 = str3;//测试用例二:实例自身赋值
    str1 = str2 = str3;//测试用例三:实现连续赋值
    str1.display();//这里测试案例写的不好,最好写成void子函数,然后函数内各种cout提示案例实现到哪一步了,这里我有点偷懒
    system("pause");
}

 

转载于:https://www.cnblogs.com/CJT-blog/p/10458442.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值