面试题1:赋值运算符

请为下面的类类型添加赋值运算符函数

class CMyString
{
private:
	char* m_pData;
public:
	CMyString(char* pData = nullptr);
	CMyString(const CMyString& str);
	~CMyString();
	//CMyString & CMyString::operator=(const CMyString & str) 此处为后续加上的函数声明,下面的为函数实现。
};

解题思路

  • 1.返回引用以便连续赋值
    (如果不是返回引用,①在形参是引用的前提下,第二次赋值左右类型不一致,无法完成赋值;②在形参不是引用的前提下,则每次赋值时都会调用赋值构造函数,消耗大量的资源)

  • 2.传入常量引用:非引用的话,形参到实参会调用一次复制构造函数,产生无谓消耗(顶层const对拷贝无影响)

  • 3.释放实例自身已有的内存

  • 4.判断传入的参数和当前的实例(*this)是不是同一个实例。如果是,不进行赋值操作,否则释放内存的时候,传入参数的内存也被释放掉了(多个对象指向同一块儿内存,释放要小心!)

#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;
};

CMyString::CMyString(char *pData)
{
    if(pData == nullptr)
    {
        m_pData = new char[1];
        m_pData[0] = '\0';
    }
    else
    {
        int length = strlen(pData);
        m_pData = new char[length + 1];
        strcpy(m_pData, pData);
    }
}

CMyString::CMyString(const CMyString &str)
{
    int length = strlen(str.m_pData);
    m_pData = new char[length + 1];
    strcpy(m_pData, str.m_pData);
}

CMyString::~CMyString()
{
    delete[] m_pData;
}

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章