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