面試題1 賦值運算子函式

2022-03-06 16:29:18 字數 2133 閱讀 2734

題目:如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。

class

cmystring

;

介紹過載賦值

過載操作符是一些函式,其名字為關鍵字operator後緊跟需要過載的運算子,比如"operator="表示需要過載"="。像任何其他函式一樣,操作符函式有乙個返回值和乙個形參表。形參表必須具有與該操作符運算元數目相同的形參,但是如果操作符是乙個成員函式,它的第乙個運算元隱式繫結到this指標,因此形參表中的引數會減少乙個。因為賦值運算子必須是類的成員函式,所以this繫結到左運算元的指標。因此,賦值操作符只接受乙個形參,且該形參是同一型別的物件,右運算元一般作為const引用傳遞,跟拷貝建構函式相同。

賦值操作符的返回型別應該與內建型別賦值運算的返回型別相同,內建型別的賦值運算返回對左運算元的引用,因此賦值操作符也返回對同一類型別的引用。賦值必須返回對*this的引用,也就是左運算元的引用。一般而言,賦值操作符與復合賦值操作符應返回左運算元的引用。

從上述基礎知識我們知道了過載賦值操作符是乙個類的成員函式,這個函式的返回型別是左運算元的引用,也就是*this,並且這個函式的引數是乙個同型別的常引用變數。通過上述知識我們可以確定過載操作符函式為:

cmystring& operator=(const cmystring& str);//

過載運算子

完整的**實現如下:

view code

#include#include

using

namespace

std;

class

cmystring

;void

cmystring::print()

//建構函式

cmystring::cmystring(char *pdata)

else

//如果建構函式的引數不為null,那麼首先求出字串長度,然後new乙個長度為len+1的字元陣列}//

析構函式

cmystring::~cmystring()

//拷貝建構函式,拷貝建構函式與建構函式的思路非常類似。

cmystring::cmystring(const cmystring&str)

//過載運算子

cmystring& cmystring::operator=(const cmystring&str)

void

main()

在上述**中,我們首先釋放例項自身已有記憶體,

//

釋放例項自身已有記憶體

delete m_pdata;

m_pdata=null;

然後再去開闢一塊記憶體空間讓m_pdata指向這塊記憶體空間,

//

在刪除自身記憶體以後在重新new乙個長度為len+1的字元陣列,類似拷貝建構函式

int len=strlen(str.m_pdata);

m_pdata=new

char[len+1];

最後使用strcpy進行字串賦值。

strcpy(m_pdata,str.m_pdata);
如果因為記憶體不足,在new char[len+1]階段丟擲異常,那麼這時候因為已經釋放了m_pdata,導致m_pdata指向乙個空指標,這樣可能會導致程式崩潰。有兩種方案解決上述問題:

view code

//

過載運算子

cmystring& cmystring::operator=(const cmystring&str)

return *this

;}

這樣的乙個好處是在執行完if語句以後,因為除了strtemp的作用於,該例項會自動呼叫析構函式,把strtemp.m_pdata所指向的記憶體釋放掉,而此時strtemp.m_pdata指向的是例項原先m_pdata指向的記憶體,並沒有釋放當前指向的ptemp這一塊記憶體。還有一點是通過建構函式為臨時例項分配記憶體,如果在new char過程中丟擲異常,並沒有改變該例項m_pdata所指向的內容,也沒有釋放記憶體,所以是異常安全性的。

面試題1 賦值運算子函式

面試題1 為如下cmysting的宣告,新增賦值運算子函式。class cmystring 注意事項 1.是否把返回值型別宣告為該型別的引用,並在函式結束前返回例項自身的引用 即 this 2.是否把傳入的引數的型別宣告為常量引用。3.是否釋放例項自身的記憶體。4.是否判斷傳入的引數和當前的例項是不...

面試題1 賦值運算子函式

面試題1 為如下cmysting的宣告,新增賦值運算子函式。class cmystring 注意事項 1.是否把返回值型別宣告為該型別的引用,並在函式結束前返回例項自身的引用 即 this 2.是否把傳入的引數的型別宣告為常量引用。3.是否釋放例項自身的記憶體。4.是否判斷傳入的引數和當前的例項是不...

面試題1 賦值運算子函式

題目 如下型別為cmystring的宣告,請為該型別新增賦值運算子函式。class cmystring 賦值運算子 函式 cmystring cmystring operator const cmystring str 當記憶體不夠時,new char會丟擲異常,分配記憶體失敗,m pdata將是乙...