String類,淺拷貝,深拷貝

2021-07-29 19:47:49 字數 1505 閱讀 1608

想要使用c++中的類那麼必須要有它的標頭檔案,#include  

首先來看下面乙個**:

這個程式很簡單,但是如果有乙個空指標呢?那麼就需要判斷了,並且用預設值把有引數的string和沒有引數的string合併在一起,那這個程式只需要做下面的改變:

既然你的建構函式開闢了一段空間,那麼就需要釋放掉,此時就需要析構函式:

以上就是整個程式在類中只有建構函式和析構函式,在類中沒有拷貝建構函式,賦值運算子。比如:

string  s3(s2);

string  s4;

s4=s2;

首先來看第乙個string  s3 (s2);,如圖所示,當delete s3 [ ]時就會把空間釋放掉,然後把s3中的_pstr置為空,但是s2此時就會變成乙個野指標。再看s4和s2,它除了會變成乙個野指標之外還會記憶體洩漏,當把s4的指標指向s2之後s4現在原來的空間將無法釋放。

那為什麼會出現這種情況,因為這個時候程式用的是系統預設的建構函式和賦值運算子過載,他們的預設程式如圖所示:

以上就是淺拷貝以及淺拷貝所有的問題,那就該如何解決以上的問題,那就是寫出我們所需要的拷貝和賦值。

#define _crt_secure_no_warnings

#include#includeusing namespace std;

class string

string(const char* pstr="")

else

}~string()

string(const string&s)

:_pstr(new char[strlen(s._pstr)+1])

string&operator=(const string&s)

return *this;

}private:

char*_pstr;

};void funtest()

int main()

以上就是深拷貝的版本。

String類 (淺拷貝 深拷貝 寫時拷貝)

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

C 淺拷貝和深拷貝(String類)

簡單的來說,淺拷貝 是增加了乙個指標,指向原來已經存在的記憶體。而 深拷貝 是增加了乙個指標,並新開闢了一塊空間 讓指標指向這塊新開闢的空間。淺拷貝 在多個物件指向一塊空間的時候,釋放乙個空間會導致其他物件所使用的空間也被釋放了,再次釋放便會出現錯誤 為了形象化說明什麼是深拷貝和淺拷貝,我們就先寫乙...

淺拷貝,深拷貝和寫時拷貝(string類)

淺拷貝 淺拷貝 編譯器只是直接將指標的值拷貝過來,結果多個物件共用了一塊記憶體,當乙個物件呼叫了析構函式將這塊記憶體釋放掉之後,另一些物件不知道這塊空間已經還給了系統,再次呼叫析構函式進行釋放時發現已經釋放了,就會造成程式崩潰。所以,在類的成員中有指標型別的成員變數的時候,必須對其寫出顯式的拷貝建構...