赋值运算符函数

已知类:

class CMyString
{
public:
    CMyString(char* pData = NULL);
    CMyString(const CMyString& str);
    ~CMyString(void);

private:
    char* m_pData;
};

初级实现:

CMyString& CMyString::operator = (const CMyString& str)    //返回引用,可连续赋值;参数为常量引用,可提高效率,避免形参与实参间多调用一次拷贝构造函数
{    
    if (this == &str)
        return *this;

    delete[] m_pData;     //若在分配新内存前忘记释放已有内存会造成内存泄露
    m_pData = NULL;
    m_pData = new char(strlen(str.m_pData) + 1);    //分配内存时可能会因为内存不足导致异常,m_pData成为空指针,容易导致程序崩溃
    strcpy(m_pData, str.m_pData);

    return *this;
}

高级实现:

CMyString& CMyString::operator = (const CMyString& str)
{
    if (this != &str)
    {
        CMyString strTemp(str);           //创建临时实例,在构造函数中用new分配内存,若出现异常,不会执行下面逻辑,因此不会修改原有实例
        char* temp = strTemp.m_pData;      //将临时实例strTemp.m_pData与原有实例m_pData做交换
        strTemp.m_pData = m_pData;
        m_pData = temp;
    }                                      //局部变量出作用域后,自动调用strTemp析构函数,释放交换后原有实例的内存

    return *this;
}

 

posted on 2021-01-20 15:24  Noora&w  阅读(128)  评论(0编辑  收藏  举报