請爲下面的類類型添加賦值運算符函數
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;
}