C 學習總結15 拷貝構造和拷貝賦值

2021-10-01 15:08:38 字數 3665 閱讀 9091

小記:靜默如初,安之若素

1. 淺拷貝和深拷貝

1)定義:如果乙個類中包含指標形式的成員變數,用預設的拷貝建構函式只是複製指標變數本身,而沒有複製指標所指向的內容,這種拷貝方式成為淺拷貝。

2)淺拷貝將會導致不同物件間的資料共享,同時會在析構函式中引發」double free「異常,因此就必須自己定義乙個支援複製指標內容的拷貝建構函式,即深拷貝.

2

using

namespace std;34

class

integer512

~integer

(void)13

17//integer i2(i1)

18 = i1.m_data

19//預設的拷貝建構函式(淺拷貝)

20/*integer(const integer& that)

21 */

2425

//integer i2(i1);

26 = new int(*i1.m_data);

27//自定義深拷貝構造

28integer

(const integer &that)

2932

33void

print

(void

)const

3437

38private:39

int*m_data;

//指標一定要注意最後釋放,否則造成記憶體洩露40}

;4142int

main

(int argc,

char

*ar**)

43

筆試題/練習:實現string類

1 #include 

2 #include

3using

namespace std;

4class

string513

//析構函式14~

string

(void)15

18//拷貝建構函式

19//淺拷貝

20//string (const string &that)

21//

2425

//深拷貝

26 string (

const string &that)

2731

private:32

char

*m_str;

33public:34

const

char

*c_str()

const

3538};

39int

main

(int argc,

char

* ar**)

40

1)當編譯器看到兩個物件的賦值操作時,比如」 i3=i2 「,會將其翻譯成函式呼叫形式: 」i3.operator = (i2)「,該函式成為拷貝賦值操作符函式,由該函式完成兩個物件的複製的過程。

2)預設的拷貝賦值函式和預設拷貝建構函式型別,也是淺拷貝,有**」double free「問題記憶體洩露**問題;

3)所以必須自己定義支援深拷貝的拷貝賦值操作符函式;

4)語法:

類名 &

operator=(

const 類名& that)

return

*this

;//返回自引用

}

#include

2using

namespace std;34

class

integer512

~integer

(void)13

17//integer i2(i1)

18 = i1.m_data

19//預設的拷貝建構函式(淺拷貝)

20/*integer(const integer& that)

21 */

2425

//integer i2(i1);

26 = new int(*i1.m_data);

27//自定義深拷貝構造

28integer

(const integer &that)

2932

33void

print

(void

)const

3437

38//i3 = i2;-->i3.operator=(i2)

39 = i2.m_data

40//類中預設的拷貝賦值函式

41/*integer& operator=(const integer& that)

42 */

47//i3 = i2;==>i3.operator=(i2)

48//*i3.m_data = *i2.m_data;

49//自定義深拷貝賦值函式

50 integer&

operator=(

const integer &that)

5158

return

*this;59

}60private:61

int*m_data;

//指標一定要注意最後釋放,否則造成記憶體洩露62}

;6364int

main

(int argc,

char

*ar**)

65

筆試題/練習:實現string類

示例程式(拷貝構造和拷貝賦值):

1 #include 

2 #include

3using

namespace std;

4class

string513

//析構函式14~

string

(void)15

18//拷貝建構函式

19//淺拷貝

20//string (const string &that)

21//

2425

//深拷貝

26 string (

const string &that)

2731

//拷貝賦值

32//自定義深拷貝賦值操作函式

33//s2==>hello

34//s3==>hello world

35//s2 = s3; ==>s2.operator(s3)

36 string&

operator=(

const string &that)

3744

return

*this

;//返回自引用45}

46private:47

char

*m_str;

48public:49

const

char

*c_str()

const

5053};

54int

main

(int argc,

char

* ar**)

55

C 拷貝建構函式 淺拷貝和深拷貝

建構函式可以沒有,也可以有多個。複製建構函式只有乙個,不定義編譯器自動生成,使用者寫就使用自定義的複製建構函式 物件之間的複製語句不會呼叫複製建構函式。利用編譯器提供的拷貝建構函式,會做淺拷貝 淺拷貝帶來的問題就死堆區記憶體的重複釋放 案例1 class student student 程式正常輸出...

拷貝構造和拷貝賦值

注意指標型別成員變數的深拷貝問題 拷貝構造屬於定義,並賦值 拷貝賦值屬於已經定義,只是賦值。拷貝構造的深拷貝,因為如果提供了拷貝建構函式,則構造該物件時使用的是拷貝建構函式。在拷貝建構函式中只需要 分配新資源,拷貝新內容,返回自引用即可。但是在拷貝賦值函式中,如果存在指標成員變數一般在物件定義時已經...

C 預設拷貝建構函式 深度拷貝和淺拷貝

c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有定義拷貝建構函式時,編譯器會預設提供乙個拷貝建構函式,進行成員變數之間的拷貝。這個拷貝操作是淺拷貝 這裡只講拷貝建構...