位拷貝與值拷貝

2021-06-19 03:49:15 字數 958 閱讀 6431

位拷貝與值拷貝,也稱淺拷貝與深拷貝。什麼是淺拷貝與深拷貝?舉個例子來說吧。

淺拷貝

char* pstr = "abcdefg";

char* pstrcpy = pstr;

深拷貝

char* pstr = "abcdefg";

char* pstrcpy = new char[10];

memset( pstrcpy, 0, 10 );

memcpy( pstrcpy, pstr, strlen(pstr) );

以下內容引用自:

為了便於說明我們以string類為例:

首先定義string類,而並不實現其成員函式。

class string;

位拷貝拷貝的是位址,而值拷貝則拷貝的是內容。如果定義兩個string物件a和b。a.m_data和b.m_data分別指向一段區域,a.m_data="windows",b.m_data=「linux";

如果未重寫賦值函式,將b賦給a;則編譯器會預設進行位拷貝,a.m_data=b.m_data

則a.m_data和b.m_data指向同一塊區域,雖然a.m_data指向的內容會改變成"linux",但是這樣容易出現這些問題:

(1):a.m_data原來指向的記憶體區域未釋放,造成記憶體洩露。

(2):a.m_data和b.m_data指向同一塊區域,任何一方改變都會影響另一方

(3):當物件被析構時,b.m_data被釋放兩次。

對於編譯器,如果不主動編寫拷貝函式和賦值函式,它會以「位拷貝」的方式自動生成預設的函式。

如果重寫賦值函式和拷貝建構函式後,

a.m_data=b.m_data,進行的是值拷貝,會將b.m_data的內容賦給a.m_data,a.m_data還是指向原來的記憶體區域,但是其內容改變。

位拷貝和值拷貝

為了便於說明我們以string類為例 首先定義string類,而並不實現其成員函式。class string 位拷貝拷貝的是位址,而值拷貝則拷貝的是內容。如果定義兩個string物件a和b。a.m data和b.m data分別指向一段區域,a.m data windows b.m data lin...

位拷貝 淺拷貝 值拷貝 深拷貝

首先定義string類,而並不實現其成員函式。class string 位拷貝拷貝的是位址,而值拷貝則拷貝的是內容。如果定義兩個string物件a和b。a.m data和b.m data分別指向一段區域,a.m data windows b.m data linux 如果未重寫賦值函式,將b賦給a ...

位拷貝 值拷貝 淺拷貝 深拷貝

位拷貝拷貝 的是位址 也叫淺拷貝 而 值拷貝則拷貝的是內容 也叫深拷貝 如果不主動編寫拷貝建構函式和賦值函式,編譯器將以 位拷貝 的方式自動生成預設的函式 現將 a賦給 b,預設賦值函式的 位拷貝 意味著執行 b.m data a.m data。這將造成三個錯誤 一是 b.m data 原有的記憶體...