文章目錄
- 面試題 1:賦值運算子函式
- 解法一:普通解法
- 解法二:考慮例外安全性
面試題 1:賦值運算子函式
題目:如下為型別CMyString的宣告,請為該型別添加賦值運算子函式
class CMyString { public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); ~CMyString(void); private: char* m_pData; };
解法一:普通解法
需要考慮以下幾點:
- 回傳值為該類參考:目的是可進行連續賦值
- 引數為const型別:目的是形參在函式內不可修改
- 引數為參考型別:目的是不呼叫拷貝建構式減少消耗
- 賦值前釋放原有空間:目的是防止出現記憶體泄漏
- 最開始要判斷自己給自己賦值的情況:如果不進行判斷,會導致釋放了自身記憶體后,形參的記憶體也被釋放掉,再也找不到需要賦值的內容了
參考代碼
CMyString& operator=(const CMyString& str)
{
// 自己給自己賦值的情況
if(this == &str)
return *this;
// 清空原有資料
if(this->m_pData != nullptr)
{
delete[] this->m_pData;
this->m_pData = nullptr;
}
// 賦值
this->m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData, str.m_pData);
return *this;
}
解法二:考慮例外安全性
需要考慮以下幾點:
- 使用new時發生了記憶體不足的情況,就會拋出例外,此時m_pData將會變成空指標,丟失原有的內容
- 賦值失敗時,保證原有內容還存在
解題思路:
- 創建一個和str一模一樣的CMyString型別臨時變數,交換m_pData指向的內容
參考代碼
CMyString& operator=(const CMyString& str)
{
if(this != &str)
{
CMyString tempStr(str); // 如果記憶體不夠,后面的陳述句將不會被執行,原有內容被保留了下來
char* tempS = tempStr.m_pData;
tempStr.m_pData = this->m_pData;
this->m_pData = tempS;
}
return *this;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262523.html
標籤:其他
