欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

面试题1:赋值运算符函数

程序员文章站 2022-03-07 20:21:13
题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。 class CMyString { public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void); private: char* m_pData; }......

题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。

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

1. 经典解法

要点:

  1. 返回值为该类型的引用,这样才允许连续赋值。
  2. 传入的参数的类型声明为常量引用,这样可以避免调用复制构造函数,提高代码效率。
  3. 释放实例自己已有的内存,避免内存泄漏。
  4. 判断传入的参数和当前的实例(*this)是不是同一个实例。如果是同一个实例,则不进行赋值操作直接返回。因为如果传入自身,一旦释放了自身的内存,传入的参数的内存也同时被释放了,就再也找不到赋值内容了。
//经典解法
CMyString& CMyString::operator = (const CMyString& str)
{
    if(this == &str)
         return *this;
         
    delete []m_pData;
    m_pData = nullptr;
    
    m_pData = new char[strlen(str.m_pData) + 1];
    strcpy(m_pData, str.m_pData);
 
    return *this;
}

2. 高级解法

要点: 在刚才的基础上考虑 new 失败抛出异常的情况,则 m_pData 将是一个空指针,赋值失败却也改变了原来的实例。可以先创建一个临时实例,再交换临时实例和原来的实例。

CMyString& CMyString::operator = (const CMyString& str)
{
    if(this != &str)
    {
        CMyString strTemp(str);
        
        char* pTemp = strTemp.m_pData;
        strTemp.m_pData = m_pData;
        m_pData = pTemp;  
    }
   
    return *this;
}

strTemp 是一个临时变量,程序运行到 if 外面时会自动调用 strTemp 的析构函数。

本文地址:https://blog.csdn.net/qq_39976464/article/details/107272275