上篇部落格我們說淺拷貝存在同一塊資源被多次釋放的問題,那麼這篇部落格就是給淺拷貝擦屁股,解決它遺留下來的問題。
解決這個問題,我們可以考慮單獨給 s2 開闢一塊空間,只將 s1 裡的內容拷貝到 s2。
看一看我們**是怎麼實現的吧:
class string
else
}//普通版版本
string(const string& s) //拷貝建構函式,這裡沒有判斷字串是否為空,是因為它不可能為空
:_pstr(new
char[strlen(s._pstr) + 1])
//要做到賦值運算子過載,首先當然是開闢一塊新空間來儲存待拷貝的內容,然後將舊空間元素拷貝到新空間,緊接著釋放掉舊空間,指向新空間,這樣複製拷貝整個過程就結束了
string& operator=(const string& s)
return *this;
}~string()
}private:
char* _pstr;
};void testfunc()
int main()
我們來看看結果怎麼樣:
除了函式作用域,呼叫析構函式,裡面內容全部被清空,沒有問題對不對。
那有人就會問有沒有更簡單的方法來實現這個功能呢?當然有了
這次我給出乙個簡潔版的**:
//第一種
string& operator=(const
string& s)
return *this;
//第二種
string& operator=(const
string& s)
//第三種
經檢驗,上面三種方法都沒毛病,讀者想用哪種就用哪種,看自己能理解那種了。
String類,淺拷貝,深拷貝
想要使用c 中的類那麼必須要有它的標頭檔案,include 首先來看下面乙個 這個程式很簡單,但是如果有乙個空指標呢?那麼就需要判斷了,並且用預設值把有引數的string和沒有引數的string合併在一起,那這個程式只需要做下面的改變 既然你的建構函式開闢了一段空間,那麼就需要釋放掉,此時就需要析構...
深拷貝 String類的實現
首先我們先來看看深淺拷貝的區別 淺拷貝是指將物件中的數值型別的字段拷貝到新的物件中,而物件中的引用型字段則指複製它的乙個引用到目標物件。如果改變目標物件 中引用型字段的值他將反映在原是物件中,也就是說原始物件中對應的字段也會發生變化。深拷貝與淺拷貝不同的是對於引用的處理,深拷貝將會在新物件中建立一 ...
String類 (淺拷貝 深拷貝 寫時拷貝)
淺拷貝是指當物件的字段值被拷貝時,字段引用的物件不會被拷貝。例如,如果乙個物件有乙個指向字串的字段,並且我們對該物件做了乙個淺拷貝,那麼兩個物件將引用同乙個字串。存在問題 如果源程式中沒有顯示定義拷貝建構函式,在進行物件的拷貝時,將呼叫系統預設的拷貝建構函式,這就使得兩個物件指向了同一資源,而析構函...