第一题 赋值运算符的重载

来源:互联网 发布:mac用的播放器 编辑:程序博客网 时间:2024/05/21 15:47

要注意的问题:
防止自赋值,是否有内存泄漏,返回值的类型以及参数类型

#include <iostream>using namespace std;class CMystring{public:    CMystring(char *pData = NULL)    {        if(pData == NULL)        {            m_pData = new char[1];            m_pData = '\0';        }        else        {            m_pData = new char[strlen(pData)+1];            strcpy(m_pData,pData);        }    }    CMystring(const CMystring& src)    {        m_pData = new char[strlen(src.m_pData)+1];        strcpy(m_pData,src.m_pData);    }    ~CMystring(void)    {        delete[]m_pData;    }    CMystring& operator=(const CMystring &src)    {        if(this == &src) return *this;        delete[] m_pData;        m_pData = new char[strlen(src.m_pData)+1];        strcpy(m_pData,src.m_pData);        return *this;    }    void show()    {        cout<<m_pData<<endl;    }private:    char* m_pData;};int main(){    CMystring str1;    CMystring str2("hello");    CMystring str3;    str3 = str2;    str3.show();    return 0;}

考虑异常安全性的解法:
在前面的运算符重载函数中,如果new时内存不足,导致抛出异常,m_pData将会是一个空指针,这样很可能引起后面程序的崩溃。

解决的方法有两种,一种是先new,再执行delete,保证了如果new失败了原有的对象未被改变;还有一种办法,创建一个临时对象,再交换与this指向的对象的资源,如果前面调用的拷贝构造函数因内存不足失败了,也不会改变原有对象,如果调用成功,临时对象中保存的原有对象的资源会在出了“}”时被释放掉。

    CMystring& operator=(const CMystring &src)    {        if(this != &src)        {            CMystring tmp(src);            char *p = tmp.m_pData;            tmp.m_pData = m_pData;            m_pData = p;        }        return *this;    }
原创粉丝点击