劍指Offer 面試題01 賦值運算子函式

2021-08-03 14:24:08 字數 904 閱讀 4171

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

class cmystring

;

考察點:

1.是否返回該型別的引用。只有返回乙個引用才能允許連續賦值。

2.是否把傳入的引數的型別宣告為const引用。若傳參,形參到實參貨呼叫一次複製建構函式。且const防止改變傳入例項。

3.是否釋放自身已有記憶體。分配新記憶體之前忘記釋放已有記憶體會造成記憶體洩露

4.是否判斷傳入引數和當前例項是不是同乙個例項。若傳入同乙個例項,一旦釋放自身記憶體,傳入引數記憶體也就釋放了,賦值內容丟棄。

初級程式設計師經典解法:

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

高階程式設計師,考慮異常安全的解法:

前乙個解法中,先delete釋放例項m_pdata的記憶體,如果此時記憶體不足則new char會丟擲異常,m_pdata將是乙個空指標,容易導致程式崩潰。

方法一是先new char 再delete,保證記憶體分配失敗時候例項保持有效狀態。

方法二是建立乙個臨時例項,再交換臨時例項和原來的例項。

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

return *this;

}

strtemp是乙個區域性變數,作用域在if之內,之後便自動析構

將原例項的m_pdata賦值給strtemp.m_pdata,這樣strtemp析構的時候會自動釋放掉

同時strtemp.m_pdata的空間交換給了this->m_pdata, 比較巧妙

劍指offer面試題7

面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...

劍指offer面試題11

面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...

劍指offer面試題15

面試題15 鍊錶中倒數第k個結點 題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第乙個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個結點是值為4的結點。預備知識 鍊錶結點的定義如下 ...