String類之 深拷貝

2021-08-22 12:05:24 字數 1098 閱讀 8531

上篇部落格我們說淺拷貝存在同一塊資源被多次釋放的問題,那麼這篇部落格就是給淺拷貝擦屁股,解決它遺留下來的問題。

解決這個問題,我們可以考慮單獨給 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類 (淺拷貝 深拷貝 寫時拷貝)

淺拷貝是指當物件的字段值被拷貝時,字段引用的物件不會被拷貝。例如,如果乙個物件有乙個指向字串的字段,並且我們對該物件做了乙個淺拷貝,那麼兩個物件將引用同乙個字串。存在問題 如果源程式中沒有顯示定義拷貝建構函式,在進行物件的拷貝時,將呼叫系統預設的拷貝建構函式,這就使得兩個物件指向了同一資源,而析構函...