C 中的位拷貝和值拷貝

2021-06-05 16:57:03 字數 1624 閱讀 3972

說明我們以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還是指向原來的記憶體區域,但是其內容改變。

public

:string(

const

char*ch

=null);

//預設建構函式

string(

const

string 

&str);

//拷貝建構函式

~string(

void

);string 

&operator=(

const

string 

&str);

//賦值函式

private

:char

*m_data;};

位拷貝拷貝的是位址,而值拷貝則拷貝的是內容。如果定義兩個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還是指向原來的記憶體區域,但是其內容改變

C 中的位拷貝和值拷貝

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

C 中的位拷貝和值拷貝

原帖 http blog.csdn.net liam1122 archive 2007 12 25 1966617.aspx 為了便於說明我們以string類為例 首先定義string類,而並不實現其成員函式。class string 位拷貝拷貝的是位址,而值拷貝則拷貝的是內容。如果定義兩個stri...

C 中的位拷貝和值拷貝

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